1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-09-21 17:01:33 +02:00

Merge branch 'v5-develop' into v5-stable

This commit is contained in:
David Bomba 2022-09-21 15:45:06 +10:00
commit 9d9460ae19
24 changed files with 1396 additions and 480 deletions

View File

@ -1 +1 @@
5.5.23
5.5.24

View File

@ -56,7 +56,7 @@ class InvoiceController extends Controller
{
set_time_limit(0);
$invoice->service()->removeUnpaidGatewayFees()->save();
// $invoice->service()->removeUnpaidGatewayFees()->save();
$invitation = $invoice->invitations()->where('client_contact_id', auth()->guard('contact')->user()->id)->first();

View File

@ -179,7 +179,7 @@ class NinjaPlanController extends Controller
->queue();
$ninja_company = Company::on('db-ninja-01')->find(config('ninja.ninja_default_company_id'));
$ninja_company->notification(new NewAccountNotification($account, $client))->ninja();
$ninja_company->notification(new NewAccountNotification($subscription->company->account, $client))->ninja();
return $this->render('plan.trial_confirmed', $data);
}

View File

@ -51,7 +51,7 @@ class NinjaMailerJob implements ShouldQueue
public $tries = 3; //number of retries
public $backoff = 10; //seconds to wait until retry
public $backoff = 30; //seconds to wait until retry
public $deleteWhenMissingModels = true;

View File

@ -108,12 +108,13 @@ class Vendor extends BaseModel
}
if (! $this->currency_id) {
$this->currency_id = 1;
return $this->company->currency();
}
return $currencies->filter(function ($item) {
return $item->id == $this->currency_id;
})->first();
}
public function company()

View File

@ -39,6 +39,7 @@ class CreditCard
public function authorizeView(array $data)
{
$data['gateway'] = $this->braintree;
$data['threeds_enable'] = $this->braintree->company_gateway->getConfigField('threeds') ? "true" : "false";
return render('gateways.braintree.credit_card.authorize', $data);
}
@ -54,11 +55,32 @@ class CreditCard
* @param array $data
* @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View
*/
private function threeDParameters(array $data)
{
return [
'amount' => $data['amount_with_fee'],
'email' => $this->braintree->client->present()->email(),
'billingAddress' => [
'givenName' => $this->braintree->client->present()->first_name() ?: $this->braintree->client->present()->name(),
'surname' => $this->braintree->client->present()->last_name() ?: '',
'phoneNumber' => $this->braintree->client->present()->phone(),
'streetAddress' => $this->braintree->client->address1 ?: '',
'extendedAddress' =>$this->braintree->client->address2 ?: '',
'locality' => $this->braintree->client->city ?: '',
'postalCode' => $this->braintree->client->postal_code ?: '',
'countryCodeAlpha2' => $this->braintree->client->country ? $this->braintree->client->country->iso_3166_2 : 'US',
]
];
}
public function paymentView(array $data)
{
$data['gateway'] = $this->braintree;
$data['client_token'] = $this->braintree->gateway->clientToken()->generate();
$data['threeds'] = $this->threeDParameters($data);
$data['threeds_enable'] = $this->braintree->company_gateway->getConfigField('threeds') ? "true" : "false";
if ($this->braintree->company_gateway->getConfigField('merchantAccountId')) {
/** https://developer.paypal.com/braintree/docs/reference/request/client-token/generate#merchant_account_id */
$data['client_token'] = $this->braintree->gateway->clientToken()->generate([
@ -78,6 +100,8 @@ class CreditCard
*/
public function paymentResponse(PaymentResponseRequest $request)
{
// nlog($request->all());
$state = [
'server_response' => json_decode($request->gateway_response),
'payment_hash' => $request->payment_hash,

View File

@ -33,7 +33,7 @@ use Checkout\CheckoutArgumentException;
use Checkout\CheckoutAuthorizationException;
use Checkout\CheckoutDefaultSdk;
use Checkout\CheckoutFourSdk;
use Checkout\Common\CustomerRequest;
use Checkout\Customers\CustomerRequest;
use Checkout\Customers\Four\CustomerRequest as FourCustomerRequest;
use Checkout\Environment;
use Checkout\Library\Exceptions\CheckoutHttpException;

View File

@ -25,6 +25,8 @@ class TaskRepository extends BaseRepository
public $new_task = true;
private $completed = true;
/**
* Saves the task and its contacts.
*

View File

@ -29,6 +29,11 @@ use Exception;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Cache;
/**
* Note the premise used here is that any currencies will be formatted back to the company currency and not
* user the vendor currency, if we continue to extend on vendor, we will need to relook at this
*/
class VendorHtmlEngine
{
use MakesDates;
@ -164,16 +169,16 @@ class VendorHtmlEngine
$data['$entity_number'] = &$data['$number'];
$data['$discount'] = ['value' => $this->entity->discount, 'label' => ctrans('texts.discount')];
$data['$subtotal'] = ['value' => Number::formatMoney($this->entity_calc->getSubTotal(), $this->vendor) ?: ' ', 'label' => ctrans('texts.subtotal')];
$data['$gross_subtotal'] = ['value' => Number::formatMoney($this->entity_calc->getGrossSubTotal(), $this->vendor) ?: ' ', 'label' => ctrans('texts.subtotal')];
$data['$subtotal'] = ['value' => Number::formatMoney($this->entity_calc->getSubTotal(), $this->company) ?: ' ', 'label' => ctrans('texts.subtotal')];
$data['$gross_subtotal'] = ['value' => Number::formatMoney($this->entity_calc->getGrossSubTotal(), $this->company) ?: ' ', 'label' => ctrans('texts.subtotal')];
if($this->entity->uses_inclusive_taxes)
$data['$net_subtotal'] = ['value' => Number::formatMoney(($this->entity_calc->getSubTotal() - $this->entity->total_taxes - $this->entity_calc->getTotalDiscount()), $this->vendor) ?: ' ', 'label' => ctrans('texts.net_subtotal')];
$data['$net_subtotal'] = ['value' => Number::formatMoney(($this->entity_calc->getSubTotal() - $this->entity->total_taxes - $this->entity_calc->getTotalDiscount()), $this->company) ?: ' ', 'label' => ctrans('texts.net_subtotal')];
else
$data['$net_subtotal'] = ['value' => Number::formatMoney($this->entity_calc->getSubTotal() - $this->entity_calc->getTotalDiscount(), $this->vendor) ?: ' ', 'label' => ctrans('texts.net_subtotal')];
$data['$net_subtotal'] = ['value' => Number::formatMoney($this->entity_calc->getSubTotal() - $this->entity_calc->getTotalDiscount(), $this->company) ?: ' ', 'label' => ctrans('texts.net_subtotal')];
if ($this->entity->partial > 0) {
$data['$balance_due'] = ['value' => Number::formatMoney($this->entity->partial, $this->vendor) ?: ' ', 'label' => ctrans('texts.partial_due')];
$data['$balance_due'] = ['value' => Number::formatMoney($this->entity->partial, $this->company) ?: ' ', 'label' => ctrans('texts.partial_due')];
$data['$balance_due_raw'] = ['value' => $this->entity->partial, 'label' => ctrans('texts.partial_due')];
$data['$amount_raw'] = ['value' => $this->entity->partial, 'label' => ctrans('texts.partial_due')];
$data['$due_date'] = ['value' => $this->translateDate($this->entity->partial_due_date, $this->company->date_format(), $this->company->locale()) ?: ' ', 'label' => ctrans('texts.'.$this->entity_string.'_due_date')];
@ -181,12 +186,12 @@ class VendorHtmlEngine
} else {
if($this->entity->status_id == 1){
$data['$balance_due'] = ['value' => Number::formatMoney($this->entity->amount, $this->vendor) ?: ' ', 'label' => ctrans('texts.balance_due')];
$data['$balance_due'] = ['value' => Number::formatMoney($this->entity->amount, $this->company) ?: ' ', 'label' => ctrans('texts.balance_due')];
$data['$balance_due_raw'] = ['value' => $this->entity->amount, 'label' => ctrans('texts.balance_due')];
$data['$amount_raw'] = ['value' => $this->entity->amount, 'label' => ctrans('texts.amount')];
}
else{
$data['$balance_due'] = ['value' => Number::formatMoney($this->entity->balance, $this->vendor) ?: ' ', 'label' => ctrans('texts.balance_due')];
$data['$balance_due'] = ['value' => Number::formatMoney($this->entity->balance, $this->company) ?: ' ', 'label' => ctrans('texts.balance_due')];
$data['$balance_due_raw'] = ['value' => $this->entity->balance, 'label' => ctrans('texts.balance_due')];
$data['$amount_raw'] = ['value' => $this->entity->amount, 'label' => ctrans('texts.amount')];
}
@ -194,18 +199,18 @@ class VendorHtmlEngine
// $data['$balance_due'] = $data['$balance_due'];
$data['$outstanding'] = &$data['$balance_due'];
$data['$partial_due'] = ['value' => Number::formatMoney($this->entity->partial, $this->vendor) ?: ' ', 'label' => ctrans('texts.partial_due')];
$data['$partial_due'] = ['value' => Number::formatMoney($this->entity->partial, $this->company) ?: ' ', 'label' => ctrans('texts.partial_due')];
$data['$partial'] = &$data['$partial_due'];
$data['$total'] = ['value' => Number::formatMoney($this->entity_calc->getTotal(), $this->vendor) ?: ' ', 'label' => ctrans('texts.total')];
$data['$total'] = ['value' => Number::formatMoney($this->entity_calc->getTotal(), $this->company) ?: ' ', 'label' => ctrans('texts.total')];
$data['$purchase_order.total'] = &$data['$total'];
$data['$amount'] = &$data['$total'];
$data['$amount_due'] = ['value' => &$data['$total']['value'], 'label' => ctrans('texts.amount_due')];
$data['$balance'] = ['value' => Number::formatMoney($this->entity_calc->getBalance(), $this->vendor) ?: ' ', 'label' => ctrans('texts.balance')];
$data['$balance'] = ['value' => Number::formatMoney($this->entity_calc->getBalance(), $this->company) ?: ' ', 'label' => ctrans('texts.balance')];
$data['$taxes'] = ['value' => Number::formatMoney($this->entity_calc->getItemTotalTaxes(), $this->vendor) ?: ' ', 'label' => ctrans('texts.taxes')];
$data['$taxes'] = ['value' => Number::formatMoney($this->entity_calc->getItemTotalTaxes(), $this->company) ?: ' ', 'label' => ctrans('texts.taxes')];
$data['$user.name'] = ['value' => $this->entity->user->present()->name(), 'label' => ctrans('texts.name')];
$data['$user.first_name'] = ['value' => $this->entity->user->first_name, 'label' => ctrans('texts.first_name')];
@ -277,7 +282,7 @@ class VendorHtmlEngine
$data['$vendor.currency'] = ['value' => $this->vendor->currency()->code, 'label' => ''];
$data['$paid_to_date'] = ['value' => Number::formatMoney($this->entity->paid_to_date, $this->vendor), 'label' => ctrans('texts.paid_to_date')];
$data['$paid_to_date'] = ['value' => Number::formatMoney($this->entity->paid_to_date, $this->company), 'label' => ctrans('texts.paid_to_date')];
$data['$contact.full_name'] = ['value' => $this->contact->present()->name(), 'label' => ctrans('texts.name')];
$data['$contact'] = &$data['$contact.full_name'];
@ -332,10 +337,10 @@ class VendorHtmlEngine
$data['$company.custom3'] = &$data['$company3'];
$data['$company.custom4'] = &$data['$company4'];
$data['$custom_surcharge1'] = ['value' => Number::formatMoney($this->entity->custom_surcharge1, $this->vendor) ?: ' ', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'surcharge1')];
$data['$custom_surcharge2'] = ['value' => Number::formatMoney($this->entity->custom_surcharge2, $this->vendor) ?: ' ', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'surcharge2')];
$data['$custom_surcharge3'] = ['value' => Number::formatMoney($this->entity->custom_surcharge3, $this->vendor) ?: ' ', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'surcharge3')];
$data['$custom_surcharge4'] = ['value' => Number::formatMoney($this->entity->custom_surcharge4, $this->vendor) ?: ' ', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'surcharge4')];
$data['$custom_surcharge1'] = ['value' => Number::formatMoney($this->entity->custom_surcharge1, $this->company) ?: ' ', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'surcharge1')];
$data['$custom_surcharge2'] = ['value' => Number::formatMoney($this->entity->custom_surcharge2, $this->company) ?: ' ', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'surcharge2')];
$data['$custom_surcharge3'] = ['value' => Number::formatMoney($this->entity->custom_surcharge3, $this->company) ?: ' ', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'surcharge3')];
$data['$custom_surcharge4'] = ['value' => Number::formatMoney($this->entity->custom_surcharge4, $this->company) ?: ' ', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'surcharge4')];
$data['$product.item'] = ['value' => '', 'label' => ctrans('texts.item')];
$data['$product.date'] = ['value' => '', 'label' => ctrans('texts.date')];
@ -608,7 +613,7 @@ class VendorHtmlEngine
foreach ($tax_map as $tax) {
$data .= '<tr class="line_taxes">';
$data .= '<td>'.$tax['name'].'</td>';
$data .= '<td>'.Number::formatMoney($tax['total'], $this->vendor).'</td></tr>';
$data .= '<td>'.Number::formatMoney($tax['total'], $this->company).'</td></tr>';
}
return $data;
@ -621,7 +626,7 @@ class VendorHtmlEngine
$data = '';
foreach ($tax_map as $tax) {
$data .= '<span>'.Number::formatMoney($tax['total'], $this->vendor).'</span>';
$data .= '<span>'.Number::formatMoney($tax['total'], $this->company).'</span>';
}
return $data;
@ -639,7 +644,7 @@ class VendorHtmlEngine
$data .= '<tr>';
$data .= '<td colspan="{ count($this->entity->company->settings->pdf_variables->total_columns) - 2 }"></td>';
$data .= '<td>'.$tax['name'].'</td>';
$data .= '<td>'.Number::formatMoney($tax['total'], $this->vendor).'</td></tr>';
$data .= '<td>'.Number::formatMoney($tax['total'], $this->company).'</td></tr>';
}
return $data;

View File

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

View File

@ -0,0 +1,50 @@
<?php
use App\Models\CompanyGateway;
use App\Models\Gateway;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
$g = Gateway::find(50);
if($g)
{
$fields = json_decode($g->fields);
$fields->threeds = false;
$g->fields = json_encode($fields);
$g->save();
}
CompanyGateway::where('gateway_key', 'f7ec488676d310683fb51802d076d713')->cursor()->each(function ($cg){
$config = $cg->getConfig();
$config->threeds = false;
$cg->setConfig($config);
$cg->save();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
}
};

View File

@ -74,7 +74,7 @@ class PaymentLibrariesSeeder extends Seeder
['id' => 47, 'name' => 'Secure Trading', 'provider' => 'SecureTrading', 'key' => '231cb401487b9f15babe04b1ac4f7a27', 'fields' => '{"siteReference":"","username":"","password":"","applyThreeDSecure":false,"accountType":"ECOM"}'],
['id' => 48, 'name' => 'SecPay', 'provider' => 'SecPay', 'key' => 'bad8699d581d9fa040e59c0bb721a76c', 'fields' => '{"mid":"","vpnPswd":"","remotePswd":"","usageType":"","confirmEmail":"","testStatus":"true","mailCustomer":"true","additionalOptions":""}'],
['id' => 49, 'name' => 'WePay', 'provider' => 'WePay', 'is_offsite' => false, 'sort_order' => 3, 'key' => '8fdeed552015b3c7b44ed6c8ebd9e992', 'fields' => '{"accountId":"","accessToken":"","type":"goods","testMode":false,"feePayer":"payee"}'],
['id' => 50, 'name' => 'Braintree', 'provider' => 'Braintree', 'sort_order' => 3, 'key' => 'f7ec488676d310683fb51802d076d713', 'fields' => '{"merchantId":"","merchantAccountId":"","publicKey":"","privateKey":"","testMode":false}'],
['id' => 50, 'name' => 'Braintree', 'provider' => 'Braintree', 'sort_order' => 3, 'key' => 'f7ec488676d310683fb51802d076d713', 'fields' => '{"merchantId":"","merchantAccountId":"","publicKey":"","privateKey":"","testMode":false,"threeds":false}'],
['id' => 51, 'name' => 'FirstData Payeezy', 'provider' => 'FirstData_Payeezy', 'key' => '30334a52fb698046572c627ca10412e8', 'fields' => '{"gatewayId":"","password":"","keyId":"","hmac":"","testMode":false}'],
['id' => 52, 'name' => 'GoCardless', 'provider' => 'GoCardless', 'sort_order' => 9, 'is_offsite' => true, 'key' => 'b9886f9257f0c6ee7c302f1c74475f6c', 'fields' => '{"accessToken":"","webhookSecret":"","testMode":true}'],
['id' => 53, 'name' => 'PagSeguro', 'provider' => 'PagSeguro', 'key' => 'ef498756b54db63c143af0ec433da803', 'fields' => '{"email":"","token":"","sandbox":false}'],

2
public/css/app.css vendored

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="none" xmlns:v="https://vecta.io/nano"><path d="M12.821 3.846l-7.051 7.051-3.205-3.205" stroke="#28ca42" stroke-width="3" stroke-linecap="round" stroke-linejoin="round"/></svg>

After

Width:  |  Height:  |  Size: 244 B

View File

@ -1,2 +1,2 @@
/*! For license information please see braintree-credit-card.js.LICENSE.txt */
(()=>{function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}(new(function(){function t(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t)}var n,a,o;return n=t,(a=[{key:"initBraintreeDataCollector",value:function(){window.braintree.client.create({authorization:document.querySelector("meta[name=client-token]").content},(function(e,t){window.braintree.dataCollector.create({client:t,paypal:!0},(function(e,t){e||(document.querySelector("input[name=client-data]").value=t.deviceData)}))}))}},{key:"mountBraintreePaymentWidget",value:function(){window.braintree.dropin.create({authorization:document.querySelector("meta[name=client-token]").content,container:"#dropin-container"},this.handleCallback)}},{key:"handleCallback",value:function(e,t){if(e)console.error(e);else{var n=document.getElementById("pay-now");n.addEventListener("click",(function(){t.requestPaymentMethod((function(e,t){if(e)return console.error(e);n.disabled=!0,n.querySelector("svg").classList.remove("hidden"),n.querySelector("span").classList.add("hidden"),document.querySelector("input[name=gateway_response]").value=JSON.stringify(t);var a=document.querySelector('input[name="token-billing-checkbox"]:checked');a&&(document.querySelector('input[name="store_card"]').value=a.value),document.getElementById("server-response").submit()}))}))}}},{key:"handle",value:function(){this.initBraintreeDataCollector(),this.mountBraintreePaymentWidget(),Array.from(document.getElementsByClassName("toggle-payment-with-token")).forEach((function(e){return e.addEventListener("click",(function(e){document.getElementById("dropin-container").classList.add("hidden"),document.getElementById("save-card--container").style.display="none",document.querySelector("input[name=token]").value=e.target.dataset.token,document.getElementById("pay-now-with-token").classList.remove("hidden"),document.getElementById("pay-now").classList.add("hidden")}))})),document.getElementById("toggle-payment-with-credit-card").addEventListener("click",(function(e){document.getElementById("dropin-container").classList.remove("hidden"),document.getElementById("save-card--container").style.display="grid",document.querySelector("input[name=token]").value="",document.getElementById("pay-now-with-token").classList.add("hidden"),document.getElementById("pay-now").classList.remove("hidden")}));var e=document.getElementById("pay-now-with-token");e.addEventListener("click",(function(t){e.disabled=!0,e.querySelector("svg").classList.remove("hidden"),e.querySelector("span").classList.add("hidden"),document.getElementById("server-response").submit()}))}}])&&e(n.prototype,a),o&&e(n,o),Object.defineProperty(n,"prototype",{writable:!1}),t}())).handle()})();
(()=>{function e(e,t){for(var n=0;n<t.length;n++){var a=t[n];a.enumerable=a.enumerable||!1,a.configurable=!0,"value"in a&&(a.writable=!0),Object.defineProperty(e,a.key,a)}}(new(function(){function t(){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,t)}var n,a,r;return n=t,(a=[{key:"initBraintreeDataCollector",value:function(){window.braintree.client.create({authorization:document.querySelector("meta[name=client-token]").content},(function(e,t){window.braintree.dataCollector.create({client:t,paypal:!0},(function(e,t){e||(document.querySelector("input[name=client-data]").value=t.deviceData)}))}))}},{key:"mountBraintreePaymentWidget",value:function(){window.braintree.dropin.create({authorization:document.querySelector("meta[name=client-token]").content,container:"#dropin-container",threeDSecure:"true"===document.querySelector("input[name=threeds_enable]").value.toLowerCase()},this.handleCallback)}},{key:"handleCallback",value:function(e,t){if(e)console.error(e);else{var n=document.getElementById("pay-now");params=JSON.parse(document.querySelector("input[name=threeds]").value),n.addEventListener("click",(function(){t.requestPaymentMethod({threeDSecure:{amount:params.amount,email:params.email,billingAddress:{givenName:params.billingAddress.givenName,surname:params.billingAddress.surname,phoneNumber:params.billingAddress.phoneNumber,streetAddress:params.billingAddress.streetAddress,extendedAddress:params.billingAddress.extendedAddress,locality:params.billingAddress.locality,region:params.billingAddress.region,postalCode:params.billingAddress.postalCode,countryCodeAlpha2:params.billingAddress.countryCodeAlpha2}}},(function(e,t){if(e)return console.log(e),dropin.clearSelectedPaymentMethod(),void alert("There was a problem verifying this card, please contact your merchant");if("true"===document.querySelector("input[name=threeds_enable]").value&&!t.liabilityShifted)return console.log("Liability did not shift",t),void alert("There was a problem verifying this card, please contact your merchant");n.disabled=!0,n.querySelector("svg").classList.remove("hidden"),n.querySelector("span").classList.add("hidden"),document.querySelector("input[name=gateway_response]").value=JSON.stringify(t);var a=document.querySelector('input[name="token-billing-checkbox"]:checked');a&&(document.querySelector('input[name="store_card"]').value=a.value),document.getElementById("server-response").submit()}))}))}}},{key:"handle",value:function(){this.initBraintreeDataCollector(),this.mountBraintreePaymentWidget(),Array.from(document.getElementsByClassName("toggle-payment-with-token")).forEach((function(e){return e.addEventListener("click",(function(e){document.getElementById("dropin-container").classList.add("hidden"),document.getElementById("save-card--container").style.display="none",document.querySelector("input[name=token]").value=e.target.dataset.token,document.getElementById("pay-now-with-token").classList.remove("hidden"),document.getElementById("pay-now").classList.add("hidden")}))})),document.getElementById("toggle-payment-with-credit-card").addEventListener("click",(function(e){document.getElementById("dropin-container").classList.remove("hidden"),document.getElementById("save-card--container").style.display="grid",document.querySelector("input[name=token]").value="",document.getElementById("pay-now-with-token").classList.add("hidden"),document.getElementById("pay-now").classList.remove("hidden")}));var e=document.getElementById("pay-now-with-token");e.addEventListener("click",(function(t){e.disabled=!0,e.querySelector("svg").classList.remove("hidden"),e.querySelector("span").classList.add("hidden"),document.getElementById("server-response").submit()}))}}])&&e(n.prototype,a),r&&e(n,r),Object.defineProperty(n,"prototype",{writable:!1}),t}())).handle()})();

View File

@ -1,50 +1,48 @@
{
"/js/app.js": "/js/app.js?id=384185bf9d293949134d",
"/js/clients/payment_methods/authorize-authorize-card.js": "/js/clients/payment_methods/authorize-authorize-card.js?id=9fb77e87fe0f85a36705",
"/js/clients/payments/authorize-credit-card-payment.js": "/js/clients/payments/authorize-credit-card-payment.js?id=803182f668c39d631ca5",
"/js/clients/payments/forte-credit-card-payment.js": "/js/clients/payments/forte-credit-card-payment.js?id=6e9f466c5504d3753f9b",
"/js/clients/payments/forte-ach-payment.js": "/js/clients/payments/forte-ach-payment.js?id=1d10fcc52a1f15858e5d",
"/js/clients/payments/stripe-ach.js": "/js/clients/payments/stripe-ach.js?id=7bed15f51bca764378d9",
"/js/clients/invoices/action-selectors.js": "/js/clients/invoices/action-selectors.js?id=d4f86ddee4e8a1d6e971",
"/js/clients/purchase_orders/action-selectors.js": "/js/clients/purchase_orders/action-selectors.js?id=160b8161599fc2429b44",
"/js/clients/purchase_orders/accept.js": "/js/clients/purchase_orders/accept.js?id=ddd4aa4069ea79411eee",
"/js/clients/invoices/payment.js": "/js/clients/invoices/payment.js?id=28221de8f1cb37f845ba",
"/js/clients/payments/stripe-sofort.js": "/js/clients/payments/stripe-sofort.js?id=1c5493a4c53a5b862d07",
"/js/clients/payments/stripe-alipay.js": "/js/clients/payments/stripe-alipay.js?id=0274ab4f8d2b411f2a2f",
"/js/clients/payments/checkout-credit-card.js": "/js/clients/payments/checkout-credit-card.js?id=4bd34a0b160f6f29b309",
"/js/clients/quotes/action-selectors.js": "/js/clients/quotes/action-selectors.js?id=6fb63bae43d077b5061f",
"/js/clients/quotes/approve.js": "/js/clients/quotes/approve.js?id=cdc76607aaf0b47a5a4e",
"/js/clients/payments/stripe-credit-card.js": "/js/clients/payments/stripe-credit-card.js?id=809de47258a681f0ffeb",
"/js/setup/setup.js": "/js/setup/setup.js?id=87367cce4927b42a92de",
"/js/clients/payments/card-js.min.js": "/js/clients/payments/card-js.min.js?id=8ce33c3deae058ad314f",
"/js/clients/shared/pdf.js": "/js/clients/shared/pdf.js?id=be5307abc990bb44f2f9",
"/js/clients/shared/multiple-downloads.js": "/js/clients/shared/multiple-downloads.js?id=c2caa29f753ad1f3a12c",
"/js/clients/linkify-urls.js": "/js/clients/linkify-urls.js?id=2b2fe55f926789abc52f",
"/js/clients/payments/braintree-credit-card.js": "/js/clients/payments/braintree-credit-card.js?id=778e63bdcb572b372ad4",
"/js/clients/payments/braintree-paypal.js": "/js/clients/payments/braintree-paypal.js?id=5764a8d406c1eda848d0",
"/js/clients/payments/wepay-credit-card.js": "/js/clients/payments/wepay-credit-card.js?id=bec9106c8ba5a973acee",
"/js/clients/payment_methods/wepay-bank-account.js": "/js/clients/payment_methods/wepay-bank-account.js?id=b8706d7de6127f184ad1",
"/js/clients/payments/paytrace-credit-card.js": "/js/clients/payments/paytrace-credit-card.js?id=e0b1231a7bf625267283",
"/js/clients/payments/mollie-credit-card.js": "/js/clients/payments/mollie-credit-card.js?id=bbab588ed009a93345be",
"/js/clients/payments/eway-credit-card.js": "/js/clients/payments/eway-credit-card.js?id=31d068e55757636f3483",
"/js/clients/payment_methods/braintree-ach.js": "/js/clients/payment_methods/braintree-ach.js?id=6d8c7fd66d911b20cdc4",
"/js/clients/payments/square-credit-card.js": "/js/clients/payments/square-credit-card.js?id=b180fd6378d3723d3e91",
"/js/clients/statements/view.js": "/js/clients/statements/view.js?id=7971b212e8a849fe36bf",
"/js/clients/payments/razorpay-aio.js": "/js/clients/payments/razorpay-aio.js?id=c36ab5621413ef1de7c8",
"/js/clients/payments/stripe-sepa.js": "/js/clients/payments/stripe-sepa.js?id=b258636d8bae366e9d8f",
"/js/clients/payment_methods/authorize-checkout-card.js": "/js/clients/payment_methods/authorize-checkout-card.js?id=e43f862d70d8710761f0",
"/js/clients/payments/stripe-giropay.js": "/js/clients/payments/stripe-giropay.js?id=72ad4ad19297f211c2e6",
"/js/clients/payments/stripe-acss.js": "/js/clients/payments/stripe-acss.js?id=90b1805b1ca0264474b3",
"/js/clients/payments/stripe-bancontact.js": "/js/clients/payments/stripe-bancontact.js?id=03e5d7ee187e76b0b7c1",
"/js/clients/payments/stripe-becs.js": "/js/clients/payments/stripe-becs.js?id=de2bd0ef2859e19e4f98",
"/js/clients/payments/stripe-eps.js": "/js/clients/payments/stripe-eps.js?id=213d9ad34a79144a0d33",
"/js/clients/payments/stripe-ideal.js": "/js/clients/payments/stripe-ideal.js?id=0a6b434e3849db26c35a",
"/js/clients/payments/stripe-przelewy24.js": "/js/clients/payments/stripe-przelewy24.js?id=3d53d2f7d0291d9f92cf",
"/js/clients/payments/stripe-browserpay.js": "/js/clients/payments/stripe-browserpay.js?id=db71055862995fd6ae21",
"/js/clients/payments/stripe-fpx.js": "/js/clients/payments/stripe-fpx.js?id=914a6846ad1e5584635e",
"/css/app.css": "/css/app.css?id=ba50afdf2f898ddd8e59",
"/css/card-js.min.css": "/css/card-js.min.css?id=62afeb675235451543ad",
"/vendor/clipboard.min.js": "/vendor/clipboard.min.js?id=15f52a1ee547f2bdd46e",
"/js/admin.js": "/js/admin.js?id=003930085af69b13a86a",
"/css/admin.css": "/css/admin.css?id=301634d751d95d3592dd"
"/js/app.js": "/js/app.js?id=384185bf9d293949134d09b890c81369",
"/js/clients/payment_methods/authorize-authorize-card.js": "/js/clients/payment_methods/authorize-authorize-card.js?id=9fb77e87fe0f85a367050e08f79ec9df",
"/js/clients/payments/authorize-credit-card-payment.js": "/js/clients/payments/authorize-credit-card-payment.js?id=803182f668c39d631ca5c55437876da4",
"/js/clients/payments/forte-credit-card-payment.js": "/js/clients/payments/forte-credit-card-payment.js?id=6e9f466c5504d3753f9b4ffc6f947095",
"/js/clients/payments/forte-ach-payment.js": "/js/clients/payments/forte-ach-payment.js?id=1d10fcc52a1f15858e5da216f1df45ec",
"/js/clients/payments/stripe-ach.js": "/js/clients/payments/stripe-ach.js?id=7bed15f51bca764378d9a3aa605b8664",
"/js/clients/invoices/action-selectors.js": "/js/clients/invoices/action-selectors.js?id=d4f86ddee4e8a1d6e9719010aa0fe62b",
"/js/clients/purchase_orders/action-selectors.js": "/js/clients/purchase_orders/action-selectors.js?id=160b8161599fc2429b449b0970d3ba6c",
"/js/clients/purchase_orders/accept.js": "/js/clients/purchase_orders/accept.js?id=ddd4aa4069ea79411eeec367b7d5986d",
"/js/clients/invoices/payment.js": "/js/clients/invoices/payment.js?id=28221de8f1cb37f845ba4ec59bcd8867",
"/js/clients/payments/stripe-sofort.js": "/js/clients/payments/stripe-sofort.js?id=1c5493a4c53a5b862d07ee1818179ea9",
"/js/clients/payments/stripe-alipay.js": "/js/clients/payments/stripe-alipay.js?id=0274ab4f8d2b411f2a2fe5142301e7af",
"/js/clients/payments/checkout-credit-card.js": "/js/clients/payments/checkout-credit-card.js?id=4bd34a0b160f6f29b3096d870ac4d308",
"/js/clients/quotes/action-selectors.js": "/js/clients/quotes/action-selectors.js?id=6fb63bae43d077b5061f4dadfe8dffc8",
"/js/clients/quotes/approve.js": "/js/clients/quotes/approve.js?id=cdc76607aaf0b47a5a4e554e4177713d",
"/js/clients/payments/stripe-credit-card.js": "/js/clients/payments/stripe-credit-card.js?id=809de47258a681f0ffebe787dd6a9a93",
"/js/setup/setup.js": "/js/setup/setup.js?id=87367cce4927b42a92defdbae7a64711",
"/js/clients/payments/card-js.min.js": "/js/clients/payments/card-js.min.js?id=8ce33c3deae058ad314fb8357e5be63b",
"/js/clients/shared/pdf.js": "/js/clients/shared/pdf.js?id=be5307abc990bb44f2f92628103b1d98",
"/js/clients/shared/multiple-downloads.js": "/js/clients/shared/multiple-downloads.js?id=c2caa29f753ad1f3a12ca45acddacd72",
"/js/clients/linkify-urls.js": "/js/clients/linkify-urls.js?id=2b2fe55f926789abc52f19111006e1ec",
"/js/clients/payments/braintree-credit-card.js": "/js/clients/payments/braintree-credit-card.js?id=cf25867ef09115b7f5a209819ba79bbf",
"/js/clients/payments/braintree-paypal.js": "/js/clients/payments/braintree-paypal.js?id=5764a8d406c1eda848d073f10d178626",
"/js/clients/payments/wepay-credit-card.js": "/js/clients/payments/wepay-credit-card.js?id=bec9106c8ba5a973acee4cfc47301324",
"/js/clients/payment_methods/wepay-bank-account.js": "/js/clients/payment_methods/wepay-bank-account.js?id=b8706d7de6127f184ad19b2a810880be",
"/js/clients/payments/paytrace-credit-card.js": "/js/clients/payments/paytrace-credit-card.js?id=e0b1231a7bf6252672836222285c0f52",
"/js/clients/payments/mollie-credit-card.js": "/js/clients/payments/mollie-credit-card.js?id=bbab588ed009a93345bec520cbe66869",
"/js/clients/payments/eway-credit-card.js": "/js/clients/payments/eway-credit-card.js?id=31d068e55757636f34834bc2494250df",
"/js/clients/payment_methods/braintree-ach.js": "/js/clients/payment_methods/braintree-ach.js?id=6d8c7fd66d911b20cdc4248e33db1b3a",
"/js/clients/payments/square-credit-card.js": "/js/clients/payments/square-credit-card.js?id=b180fd6378d3723d3e9133e0b1943ac6",
"/js/clients/statements/view.js": "/js/clients/statements/view.js?id=7971b212e8a849fe36bfe915f81023bd",
"/js/clients/payments/razorpay-aio.js": "/js/clients/payments/razorpay-aio.js?id=c36ab5621413ef1de7c864bc8eb7439e",
"/js/clients/payments/stripe-sepa.js": "/js/clients/payments/stripe-sepa.js?id=b258636d8bae366e9d8f54274f437181",
"/js/clients/payment_methods/authorize-checkout-card.js": "/js/clients/payment_methods/authorize-checkout-card.js?id=e43f862d70d8710761f0856e528ec3d1",
"/js/clients/payments/stripe-giropay.js": "/js/clients/payments/stripe-giropay.js?id=72ad4ad19297f211c2e6d0fa1fa1f76d",
"/js/clients/payments/stripe-acss.js": "/js/clients/payments/stripe-acss.js?id=90b1805b1ca0264474b38054a2664c5b",
"/js/clients/payments/stripe-bancontact.js": "/js/clients/payments/stripe-bancontact.js?id=03e5d7ee187e76b0b7c16bfa91804a8a",
"/js/clients/payments/stripe-becs.js": "/js/clients/payments/stripe-becs.js?id=de2bd0ef2859e19e4f98ea9d6d11cb54",
"/js/clients/payments/stripe-eps.js": "/js/clients/payments/stripe-eps.js?id=213d9ad34a79144a0d3345cb6a262e95",
"/js/clients/payments/stripe-ideal.js": "/js/clients/payments/stripe-ideal.js?id=0a6b434e3849db26c35a143e0347e914",
"/js/clients/payments/stripe-przelewy24.js": "/js/clients/payments/stripe-przelewy24.js?id=3d53d2f7d0291d9f92cf7414dd2d351c",
"/js/clients/payments/stripe-browserpay.js": "/js/clients/payments/stripe-browserpay.js?id=db71055862995fd6ae21becfc587a3de",
"/js/clients/payments/stripe-fpx.js": "/js/clients/payments/stripe-fpx.js?id=914a6846ad1e5584635e7430fef76875",
"/css/app.css": "/css/app.css?id=6bafb560444b3b12f8d1ce59bd7fd703",
"/css/card-js.min.css": "/css/card-js.min.css?id=62afeb675235451543ada60afcedcb7c",
"/vendor/clipboard.min.js": "/vendor/clipboard.min.js?id=15f52a1ee547f2bdd46e56747332ca2d"
}

View File

@ -28,26 +28,54 @@ class BraintreeCreditCard {
}
mountBraintreePaymentWidget() {
window.braintree.dropin.create({
authorization: document.querySelector('meta[name=client-token]').content,
container: '#dropin-container'
container: '#dropin-container',
threeDSecure: document.querySelector('input[name=threeds_enable]').value.toLowerCase() === 'true'
}, this.handleCallback);
}
handleCallback(error, dropinInstance) {
if (error) {
console.error(error);
return;
}
let payNow = document.getElementById('pay-now');
params = JSON.parse(document.querySelector('input[name=threeds]').value);
payNow.addEventListener('click', () => {
dropinInstance.requestPaymentMethod((error, payload) => {
if (error) {
return console.error(error);
dropinInstance.requestPaymentMethod({
threeDSecure: {
amount: params.amount,
email: params.email,
billingAddress: {
givenName: params.billingAddress.givenName, // ASCII-printable characters required, else will throw a validation error
surname: params.billingAddress.surname, // ASCII-printable characters required, else will throw a validation error
phoneNumber: params.billingAddress.phoneNumber,
streetAddress: params.billingAddress.streetAddress,
extendedAddress: params.billingAddress.extendedAddress,
locality: params.billingAddress.locality,
region: params.billingAddress.region,
postalCode: params.billingAddress.postalCode,
countryCodeAlpha2: params.billingAddress.countryCodeAlpha2
}
}
}, function(err, payload) {
if (err) {
console.log(err);
dropin.clearSelectedPaymentMethod();
alert("There was a problem verifying this card, please contact your merchant");
return;
}
if (document.querySelector('input[name=threeds_enable]').value === 'true' && !payload.liabilityShifted) {
console.log('Liability did not shift', payload);
alert("There was a problem verifying this card, please contact your merchant");
return;
}
payNow.disabled = true;

View File

@ -21,7 +21,9 @@
</script>
<script>
window.flutterConfiguration = {
canvasKitBaseUrl: "{{ $canvas_path }}/canvaskit/"
@if(!\App\Utils\Ninja::isHosted())
canvasKitBaseUrl: "{{ $canvas_path }}/canvaskit/"
@endif
};
</script>
</head>

View File

@ -3,9 +3,12 @@
@section('gateway_head')
<meta name="client-token" content="{{ $client_token ?? '' }}"/>
<script src="https://js.braintreegateway.com/web/dropin/1.27.0/js/dropin.min.js"></script>
<script src="https://js.braintreegateway.com/web/3.76.2/js/client.min.js"></script>
<script src="https://js.braintreegateway.com/web/3.76.2/js/data-collector.min.js"></script>
<script src='https://js.braintreegateway.com/web/dropin/1.33.4/js/dropin.min.js'></script>
{{-- <script src="https://js.braintreegateway.com/web/3.76.2/js/client.min.js"></script> --}}
<script src="https://js.braintreegateway.com/web/3.87.0/js/data-collector.min.js"></script>
<!-- Load the client component. -->
<script src='https://js.braintreegateway.com/web/3.87.0/js/client.min.js'></script>
<style>
[data-braintree-id="toggle"] {
@ -19,6 +22,7 @@
@csrf
<input type="hidden" name="gateway_response">
<input type="hidden" name="store_card">
<input type="hidden" name="threeds_enable" value="{!! $threeds_enable !!}">
<input type="hidden" name="payment_hash" value="{{ $payment_hash }}">
<input type="hidden" name="company_gateway_id" value="{{ $gateway->getCompanyGatewayId() }}">
@ -26,6 +30,7 @@
<input type="hidden" name="token">
<input type="hidden" name="client-data">
<input type="hidden" name="threeds" value="{{ json_encode($threeds) }}">
</form>
@component('portal.ninja2020.components.general.card-element', ['title' => ctrans('texts.payment_type')])
@ -72,3 +77,5 @@
@section('gateway_footer')
<script src="{{ asset('js/clients/payments/braintree-credit-card.js') }}"></script>
@endsection
<div id="threeds"></div>

View File

@ -11,7 +11,7 @@
@endpush
@section('body')
@livewire('required-client-info', ['fields' => method_exists($gateway, 'getClientRequiredFields') ? $gateway->getClientRequiredFields() : [], 'contact' => auth()->guard('contact')->user(), 'countries' => $countries, 'company' => $company, 'company_gateway_id' => $gateway->company_gateway->id])
@livewire('required-client-info', ['fields' => method_exists($gateway, 'getClientRequiredFields') ? $gateway->getClientRequiredFields() : [], 'contact' => auth()->guard('contact')->user(), 'countries' => $countries, 'company' => $company, 'company_gateway_id' => $gateway->company_gateway ? $gateway->company_gateway->id : $gateway->id])
<div class="container mx-auto grid grid-cols-12 opacity-25 pointer-events-none" data-ref="gateway-container">
<div class="col-span-12 lg:col-span-6 lg:col-start-4 bg-white shadow rounded-lg">

File diff suppressed because it is too large Load Diff

View File

@ -4,17 +4,8 @@
@section('body')
@push('head')
<style type="text/css">
@import url('https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,300;1,400;1,500;1,600;1,700;1,800&display=swap');
/*
! tailwindcss v3.0.24 | MIT License | https://tailwindcss.com
*/
/*
1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4)
2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116)
*/
<style>
@import url('https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,300;1,400;1,500;1,600;1,700;1,800&display=swap');
*,
::before,
@ -25,7 +16,7 @@
/* 2 */
border-style: solid;
/* 2 */
border-color: #e5e7eb;
border-color: currentColor;
/* 2 */
}
@ -477,6 +468,18 @@ Ensure the default browser behavior of the `hidden` attribute.
--tw-backdrop-sepia: ;
}
.sr-only{
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
white-space: nowrap;
border-width: 0;
}
.absolute{
position: absolute;
}
@ -502,10 +505,24 @@ Ensure the default browser behavior of the `hidden` attribute.
margin-right: auto;
}
.mx-\[22px\]{
margin-left: 22px;
margin-right: 22px;
}
.mx-\[40px\]{
margin-left: 40px;
margin-right: 40px;
}
.mb-\[30px\]{
margin-bottom: 30px;
}
.mb-\[11px\]{
margin-bottom: 11px;
}
.mt-\[30px\]{
margin-top: 30px;
}
@ -554,12 +571,56 @@ Ensure the default browser behavior of the `hidden` attribute.
margin-bottom: 26px;
}
.mb-\[\]{
margin-bottom: ;
.mb-\[25px\]{
margin-bottom: 25px;
}
.mb-\[11px\]{
margin-bottom: 11px;
.mb-\[20px\]{
margin-bottom: 20px;
}
.mb-\[5px\]{
margin-bottom: 5px;
}
.mb-\[40px\]{
margin-bottom: 40px;
}
.mr-5{
margin-right: 1.25rem;
}
.ml-5{
margin-left: 1.25rem;
}
.ml-\[10px\]{
margin-left: 10px;
}
.mb-6{
margin-bottom: 1.5rem;
}
.mb-8{
margin-bottom: 2rem;
}
.mb-1\.5{
margin-bottom: 0.375rem;
}
.mb-1{
margin-bottom: 0.25rem;
}
.mb-5{
margin-bottom: 1.25rem;
}
.mb-\[36px\]{
margin-bottom: 36px;
}
.block{
@ -570,14 +631,30 @@ Ensure the default browser behavior of the `hidden` attribute.
display: flex;
}
.inline-flex{
display: inline-flex;
}
.hidden{
display: none;
}
.h-\[40px\]{
height: 40px;
}
.min-h-\[450px\]{
min-height: 450px;
}
.min-h-\[57\%\]{
min-height: 57%;
}
.min-h-\[411px\]{
min-height: 411px;
}
.w-\[100\%\]{
width: 100%;
}
@ -586,6 +663,10 @@ Ensure the default browser behavior of the `hidden` attribute.
width: 100%;
}
.w-\[87px\]{
width: 87px;
}
.max-w-\[625px\]{
max-width: 625px;
}
@ -594,6 +675,10 @@ Ensure the default browser behavior of the `hidden` attribute.
max-width: 212px;
}
.max-w-\[450px\]{
max-width: 450px;
}
.flex-1{
flex: 1 1 0%;
}
@ -606,6 +691,10 @@ Ensure the default browser behavior of the `hidden` attribute.
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.cursor-pointer{
cursor: pointer;
}
.flex-col{
flex-direction: column;
}
@ -614,6 +703,22 @@ Ensure the default browser behavior of the `hidden` attribute.
flex-direction: column-reverse;
}
.content-start{
align-content: flex-start;
}
.items-start{
align-items: flex-start;
}
.items-center{
align-items: center;
}
.justify-start{
justify-content: flex-start;
}
.justify-end{
justify-content: flex-end;
}
@ -667,10 +772,26 @@ Ensure the default browser behavior of the `hidden` attribute.
border-radius: 5px;
}
.rounded-full{
border-radius: 9999px;
}
.rounded-lg{
border-radius: 0.5rem;
}
.rounded-\[10px\]{
border-radius: 10px;
}
.border{
border-width: 1px;
}
.border-\[10px\]{
border-width: 10px;
}
.border-t-\[0px\]{
border-top-width: 0px;
}
@ -683,6 +804,10 @@ Ensure the default browser behavior of the `hidden` attribute.
border-top-width: 1px;
}
.border-t-\[11px\]{
border-top-width: 11px;
}
.border-light-grey{
--tw-border-opacity: 1;
border-color: rgb(232 233 237 / var(--tw-border-opacity));
@ -693,6 +818,20 @@ Ensure the default browser behavior of the `hidden` attribute.
border-color: rgb(0 145 234 / var(--tw-border-opacity));
}
.border-\[transparent\]{
border-color: transparent;
}
.border-\[\#28CA42\]{
--tw-border-opacity: 1;
border-color: rgb(40 202 66 / var(--tw-border-opacity));
}
.border-primary-green{
--tw-border-opacity: 1;
border-color: rgb(40 202 66 / var(--tw-border-opacity));
}
.bg-secondary-dark{
--tw-bg-opacity: 1;
background-color: rgb(73 68 68 / var(--tw-bg-opacity));
@ -708,6 +847,28 @@ Ensure the default browser behavior of the `hidden` attribute.
background-color: rgb(0 145 234 / var(--tw-bg-opacity));
}
.bg-primary-blue\/\[\.05\]{
background-color: rgb(0 145 234 / .05);
}
.bg-primary-grey{
--tw-bg-opacity: 1;
background-color: rgb(229 229 229 / var(--tw-bg-opacity));
}
.bg-primary-blue\/50{
background-color: rgb(0 145 234 / 0.5);
}
.bg-primary-blue\/5{
background-color: rgb(0 145 234 / 0.05);
}
.bg-\[\#F2F9FE\]{
--tw-bg-opacity: 1;
background-color: rgb(242 249 254 / var(--tw-bg-opacity));
}
.bg-clip-padding{
background-clip: padding-box;
}
@ -720,6 +881,10 @@ Ensure the default browser behavior of the `hidden` attribute.
padding: 20px;
}
.p-\[12px\]{
padding: 12px;
}
.py-\[36px\]{
padding-top: 36px;
padding-bottom: 36px;
@ -797,6 +962,26 @@ Ensure the default browser behavior of the `hidden` attribute.
padding-bottom: 26px;
}
.pb-\[58px\]{
padding-bottom: 58px;
}
.pt-\[35px\]{
padding-top: 35px;
}
.pb-\[34px\]{
padding-bottom: 34px;
}
.pt-\[29px\]{
padding-top: 29px;
}
.pb-\[56px\]{
padding-bottom: 56px;
}
.text-left{
text-align: left;
}
@ -843,6 +1028,18 @@ Ensure the default browser behavior of the `hidden` attribute.
font-size: 14px;
}
.text-\[16px\]{
font-size: 16px;
}
.text-\[22px\]{
font-size: 22px;
}
.text-\[35px\]{
font-size: 35px;
}
.font-normal{
font-weight: 400;
}
@ -883,6 +1080,14 @@ Ensure the default browser behavior of the `hidden` attribute.
line-height: 1.5em;
}
.leading-\[1\.375em\]{
line-height: 1.375em;
}
.leading-\[1\.2rem\]{
line-height: 1.2rem;
}
.text-white{
--tw-text-opacity: 1;
color: rgb(255 255 255 / var(--tw-text-opacity));
@ -893,11 +1098,6 @@ Ensure the default browser behavior of the `hidden` attribute.
color: rgb(0 145 234 / var(--tw-text-opacity));
}
.text-gray-700{
--tw-text-opacity: 1;
color: rgb(55 65 81 / var(--tw-text-opacity));
}
.text-dark-grey{
--tw-text-opacity: 1;
color: rgb(142 147 167 / var(--tw-text-opacity));
@ -908,6 +1108,21 @@ Ensure the default browser behavior of the `hidden` attribute.
color: rgb(219 220 222 / var(--tw-text-opacity));
}
.text-black{
--tw-text-opacity: 1;
color: rgb(0 0 0 / var(--tw-text-opacity));
}
.text-primary-dark{
--tw-text-opacity: 1;
color: rgb(46 44 44 / var(--tw-text-opacity));
}
.text-gray{
--tw-text-opacity: 1;
color: rgb(100 111 121 / var(--tw-text-opacity));
}
.transition{
transition-property: color, background-color, border-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-text-decoration-color, -webkit-backdrop-filter;
transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter;
@ -944,16 +1159,16 @@ Ensure the default browser behavior of the `hidden` attribute.
.list-checkmark-round li {
position: relative;
padding-left: 44px;
padding-left: 40px;
}
.list-checkmark-round li::before {
content: "";
position: absolute;
left: 0;
top: -2px;
width: 37px;
height: 37px;
top: 0px;
width: 30px;
height: 30px;
background: url('/images/checkmark-round.svg') center/contain no-repeat;
}
@ -977,6 +1192,10 @@ Ensure the default browser behavior of the `hidden` attribute.
background: url('/images/checkmark.svg') center/contain no-repeat;
}
.list-checkmark_green li::before {
background: url('/images/checkmark-green.svg') center/contain no-repeat;
}
/* Main Content */
.pro-plan-trial {
@ -984,19 +1203,6 @@ Ensure the default browser behavior of the `hidden` attribute.
overflow: hidden;
}
.pro-plan-trial::before {
content: "";
position: absolute;
right: 0;
bottom: 0;
width: 601px;
height: 601px;
background: #0091EA;
border-radius: 50%;
transform: translate(129px, 449px);
z-index: 1;
}
.success-banner {
position: relative;
overflow: hidden;
@ -1019,6 +1225,64 @@ Ensure the default browser behavior of the `hidden` attribute.
}
}
.after\:absolute::after{
content: var(--tw-content);
position: absolute;
}
.after\:top-\[5px\]::after{
content: var(--tw-content);
top: 5px;
}
.after\:left-\[8px\]::after{
content: var(--tw-content);
left: 8px;
}
.after\:h-\[30px\]::after{
content: var(--tw-content);
height: 30px;
}
.after\:w-\[30px\]::after{
content: var(--tw-content);
width: 30px;
}
.after\:rounded-full::after{
content: var(--tw-content);
border-radius: 9999px;
}
.after\:bg-white::after{
content: var(--tw-content);
--tw-bg-opacity: 1;
background-color: rgb(255 255 255 / var(--tw-bg-opacity));
}
.after\:transition-all::after{
content: var(--tw-content);
transition-property: all;
transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
transition-duration: 150ms;
}
.after\:content-\[\'\'\]::after{
--tw-content: '';
content: var(--tw-content);
}
.hover\:bg-primary-green:hover{
--tw-bg-opacity: 1;
background-color: rgb(40 202 66 / var(--tw-bg-opacity));
}
.hover\:text-white:hover{
--tw-text-opacity: 1;
color: rgb(255 255 255 / var(--tw-text-opacity));
}
.hover\:opacity-80:hover{
opacity: 0.8;
}
@ -1033,6 +1297,32 @@ Ensure the default browser behavior of the `hidden` attribute.
outline-offset: 2px;
}
.peer:checked ~ .peer-checked\:bg-primary-blue{
--tw-bg-opacity: 1;
background-color: rgb(0 145 234 / var(--tw-bg-opacity));
}
.peer:checked ~ .peer-checked\:text-gray{
--tw-text-opacity: 1;
color: rgb(100 111 121 / var(--tw-text-opacity));
}
.peer:checked ~ .peer-checked\:text-black{
--tw-text-opacity: 1;
color: rgb(0 0 0 / var(--tw-text-opacity));
}
.peer:checked ~ .peer-checked\:after\:translate-x-\[140\%\]::after{
content: var(--tw-content);
--tw-translate-x: 140%;
transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y));
}
.peer:focus ~ .peer-focus\:outline-none{
outline: 2px solid transparent;
outline-offset: 2px;
}
@media (min-width: 768px){
.md\:mx-\[0\]{
margin-left: 0;
@ -1047,6 +1337,10 @@ Ensure the default browser behavior of the `hidden` attribute.
display: flex;
}
.md\:min-h-\[411px\]{
min-height: 411px;
}
.md\:w-1\/2{
width: 50%;
}
@ -1055,6 +1349,18 @@ Ensure the default browser behavior of the `hidden` attribute.
width: 33.333333%;
}
.md\:shrink{
flex-shrink: 1;
}
.md\:grow-0{
flex-grow: 0;
}
.md\:basis-\[449px\]{
flex-basis: 449px;
}
.md\:flex-row{
flex-direction: row;
}
@ -1073,6 +1379,18 @@ Ensure the default browser behavior of the `hidden` attribute.
padding-right: 58px;
}
.md\:px-\[40px\]{
padding-left: 40px;
padding-right: 40px;
}
@media (min-width: 768px){
.md\:md\:px-\[40px\]{
padding-left: 40px;
padding-right: 40px;
}
}
.md\:pl-\[61px\]{
padding-left: 61px;
}
@ -1081,6 +1399,22 @@ Ensure the default browser behavior of the `hidden` attribute.
padding-right: 20px;
}
.md\:pt-\[58px\]{
padding-top: 58px;
}
.md\:pb-\[40px\]{
padding-bottom: 40px;
}
.md\:pl-\[52px\]{
padding-left: 52px;
}
.md\:pr-\[48px\]{
padding-right: 48px;
}
.md\:text-left{
text-align: left;
}
@ -1089,32 +1423,37 @@ Ensure the default browser behavior of the `hidden` attribute.
font-size: 30px;
}
}
@media (min-width: 1024px){
.lg\:max-w-\[80\%\]{
max-width: 80%;
}
}
</style>
@endpush
<!-- This example requires Tailwind CSS v2.0+ -->
<main
class="font-['Open_Sans'] text-[15px] font-normal leading-[1.75em] flex-1 relative z-0 overflow-y-auto pt-[20px] pl-[18px] pr-[18px] pb-[20px] focus:outline-none"
tabindex="0"
>
<div class="min-h-[450px] flex justify-stretch overflow-hidden">
<div class="success-banner p-[20px] w-[100%] gap-[44px] flex flex-col-reverse justify-center align-stretch bg-secondary-dark text-white rounded overflow-hidden md:flex-row">
<div class="success-banner__media flex flex-col justify-senter align-center">
<img class="w-[100%] max-w-[625px] z-10" src="/images/hero-success.svg" alt="">
</div>
<div class="flex flex-col justify-center align-center text-center z-10 md:text-left">
<h4 class="text-[14px] mb-[10px] text-light-grey-secondary uppercase">Create. Send. Get Paid.</h4>
<h2 class="text-[24px] font-bold leading-[1.5em] mb-[26px] relative md:text-[30px] md:mb-[46px]">
Your Pro Plan trial is <br/>loaded and ready to go!
</h2>
<a href="https://invoicing.co"
type="button"
class="mx-[auto] max-w-[212px] text-center bg-primary-blue hover:opacity-80 button button-primary bg-primary rounded-sm text-sm transition duration-300 ease-in md:mx-[0]"
>
Account Login
</a>
</div>
</div>
</div>
</main>
<main
class="font-['Open_Sans'] text-[15px] font-normal leading-[1.75em] flex-1 relative z-0 overflow-y-auto pt-[20px] pl-[18px] pr-[18px] pb-[20px] focus:outline-none"
tabindex="0"
>
<div class="min-h-[450px] flex justify-stretch overflow-hidden">
<div class="success-banner p-[20px] w-[100%] gap-[44px] flex flex-col-reverse justify-center align-stretch bg-secondary-dark text-white rounded overflow-hidden md:flex-row">
<div class="success-banner__media flex flex-col justify-senter align-center">
<img class="w-[100%] max-w-[625px] z-10" src="./images/hero-success.svg" alt="">
</div>
<div class="flex flex-col justify-center align-center text-center z-10 md:text-left">
<h4 class="text-[14px] mb-[10px] text-light-grey-secondary uppercase">Create. Send. Get Paid.</h4>
<h2 class="text-[24px] font-bold leading-[1.5em] mb-[26px] relative md:text-[30px] md:mb-[46px]">
Your Pro Plan trial is <br/>loaded and ready to go!
</h2>
<a href="https://invoicing.co"
type="button"
class="mx-[auto] max-w-[212px] bg-primary-blue hover:opacity-80 button button-primary bg-primary rounded-sm text-sm transition duration-300 ease-in md:mx-[0]"
>
Account Login
</a>
</div>
</div>
</div>
</main>
@endsection

View File

@ -215,5 +215,8 @@ class StorePaymentValidationTest extends TestCase
} catch (ValidationException $e) {
$response->assertStatus(302);
}
$response->assertStatus(302);
}
}

View File

@ -1,92 +0,0 @@
<?php
/**
* 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
*/
namespace Tests\Feature;
use App\Models\Project;
use App\Models\Task;
use App\Models\TaskStatus;
use App\Utils\Traits\MakesHash;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Routing\Middleware\ThrottleRequests;
use Tests\MockAccountData;
use Tests\TestCase;
/**
* @test
*/
class TaskStatusSortOnUpdateTest extends TestCase
{
use DatabaseTransactions;
use MockAccountData;
use MakesHash;
protected function setUp() :void
{
parent::setUp();
$this->makeTestData();
$this->withoutMiddleware(
ThrottleRequests::class
);
}
// public function testTasksSort()
// {
// $project = Project::factory()->create([
// 'user_id' => $this->user->id,
// 'company_id' => $this->company->id,
// 'name' => 'Test Project',
// ]);
// for($x=0; $x<10; $x++)
// {
// $task = Task::factory()->create([
// 'user_id' => $this->user->id,
// 'company_id' => $this->company->id,
// 'project_id' => $project->id
// ]);
// $task->status_id = TaskStatus::where('company_id', $this->company->id)->first()->id;
// $task->save();
// }
// $this->assertTrue($task->project()->exists());
// $this->assertEquals($task->project->tasks->count(), 10);
// $task->status_order = 1;
// $response = $this->withHeaders([
// 'X-API-SECRET' => config('ninja.api_secret'),
// 'X-API-TOKEN' => $this->token,
// ])->put('/api/v1/tasks/'.$this->encodePrimaryKey($task->id), $task->toArray());
// $response->assertStatus(200);
// $this->assertEquals($task->fresh()->status_order, 1);
// $task->status_order = 10;
// $response = $this->withHeaders([
// 'X-API-SECRET' => config('ninja.api_secret'),
// 'X-API-TOKEN' => $this->token,
// ])->put('/api/v1/tasks/'.$this->encodePrimaryKey($task->id), $task->toArray());
// $response->assertStatus(200);
// nlog($task->fresh()->project->tasks->toArray());
// $this->assertEquals($task->fresh()->status_order, 9);
// }
}