Update v5-dev branch

This commit is contained in:
David Bomba 2023-02-28 17:15:00 +11:00
commit 25bfe755c4
75 changed files with 292231 additions and 295490 deletions

1
.gitignore vendored
View File

@ -35,3 +35,4 @@ nbproject
public/test.pdf
public/storage/test.pdf
/Modules
_ide_helper_models.php

View File

@ -114,12 +114,33 @@ class CreateSingleAccount extends Command
'portal_domain' => 'http://ninja.test:8000',
'track_inventory' => true
]);
$faker = \Faker\Factory::create();
$settings = $company->settings;
$settings->invoice_terms = 'Default company invoice terms';
$settings->quote_terms = 'Default company quote terms';
$settings->invoice_footer = 'Default invoice footer';
$settings->company_logo = 'https://pdf.invoicing.co/favicon-v2.png';
$settings->name = $faker->name();
$settings->email = $faker->safeEmail();
$settings->phone = $faker->phoneNumber();
$settings->website = $faker->url();
$settings->address1 = $faker->streetName();
$settings->address2 = $faker->streetAddress();
$settings->city = $faker->city();
$settings->state = $faker->state();
$settings->postal_code = $faker->postcode();
$settings->country_id = '840';
$settings->vat_number = 'vat number';
$settings->id_number = 'id number';
$settings->use_credits_payment = 'always';
$settings->timezone_id = '1';
$settings->entity_send_time = 0;
$settings->name = $faker->name();
$company->settings = $settings;
$company->client_registration_fields = ClientRegistrationFields::generate();
$company->save();

View File

@ -0,0 +1,65 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Filters;
use Illuminate\Database\Eloquent\Builder;
/**
* SchedulerFilters.
*/
class SchedulerFilters extends QueryFilters
{
/**
* Filter based on search text.
*
* @param string query filter
* @return Builder
* @deprecated
*/
public function filter(string $filter = ''): Builder
{
if (strlen($filter) == 0) {
return $this->builder;
}
return $this->builder->where(function ($query) use ($filter) {
$query->where('name', 'like', '%'.$filter.'%');
});
}
/**
* Sorts the list based on $sort.
*
* @param string sort formatted as column|asc
* @return Builder
*/
public function sort(string $sort = ''): Builder
{
$sort_col = explode('|', $sort);
if (!is_array($sort_col) || count($sort_col) != 2) {
return $this->builder;
}
return $this->builder->orderBy($sort_col[0], $sort_col[1]);
}
/**
* Filters the query by the users company ID.
*
* @return Builder
*/
public function entityFilter(): Builder
{
return $this->builder->company();
}
}

View File

@ -12,21 +12,24 @@
namespace App\Http\Controllers\ClientPortal;
use App\Factory\PaymentFactory;
use App\Http\Controllers\Controller;
use App\Http\Requests\ClientPortal\Payments\PaymentResponseRequest;
use App\Models\CompanyGateway;
use App\Models\Invoice;
use App\Models\Payment;
use Illuminate\View\View;
use App\Models\GatewayType;
use App\Models\PaymentHash;
use App\Models\PaymentType;
use Illuminate\Http\Request;
use App\Models\CompanyGateway;
use App\Factory\PaymentFactory;
use App\Utils\Traits\MakesHash;
use App\Utils\Traits\MakesDates;
use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Contracts\View\Factory;
use App\PaymentDrivers\Stripe\BankTransfer;
use App\Services\ClientPortal\InstantPayment;
use App\Services\Subscription\SubscriptionService;
use App\Utils\Traits\MakesDates;
use App\Utils\Traits\MakesHash;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
use App\Http\Requests\ClientPortal\Payments\PaymentResponseRequest;
/**
* Class PaymentController.
@ -56,9 +59,35 @@ class PaymentController extends Controller
public function show(Request $request, Payment $payment)
{
$payment->load('invoices');
$bank_details = false;
$payment_intent = false;
$data = false;
$gateway = false;
if($payment->gateway_type_id == GatewayType::DIRECT_DEBIT && $payment->type_id == PaymentType::DIRECT_DEBIT){
if (method_exists($payment->company_gateway->driver($payment->client), 'getPaymentIntent')) {
$stripe = $payment->company_gateway->driver($payment->client);
$payment_intent = $stripe->getPaymentIntent($payment->transaction_reference);
$bt = new BankTransfer($stripe);
match($payment->currency->code){
'MXN' => $data = $bt->formatDataforMx($payment_intent),
'EUR' => $data = $bt->formatDataforEur($payment_intent),
'JPY' => $data = $bt->formatDataforJp($payment_intent),
'GBP' => $data = $bt->formatDataforUk($payment_intent),
};
$gateway = $stripe;
}
}
return $this->render('payments.show', [
'payment' => $payment,
'bank_details' => $payment_intent ? $data : false,
'currency' => strtolower($payment->currency->code),
]);
}

View File

@ -12,7 +12,8 @@
namespace App\Http\Controllers;
use App\Factory\SchedulerFactory;
use App\Http\Requests\Task\DestroySchedulerRequest;
use App\Filters\SchedulerFilters;
use App\Http\Requests\TaskScheduler\DestroySchedulerRequest;
use App\Http\Requests\TaskScheduler\CreateSchedulerRequest;
use App\Http\Requests\TaskScheduler\ShowSchedulerRequest;
use App\Http\Requests\TaskScheduler\StoreSchedulerRequest;
@ -58,9 +59,9 @@ class TaskSchedulerController extends BaseController
* ),
* )
*/
public function index()
public function index(SchedulerFilters $filters)
{
$schedulers = Scheduler::where('company_id', auth()->user()->company()->id);
$schedulers = Scheduler::filter($filters);
return $this->listResponse($schedulers);
}

View File

@ -29,8 +29,15 @@ class UploadBankIntegrationRequest extends Request
{
$rules = [];
if ($this->input('documents')) {
$rules['documents'] = 'file|mimes:csv,png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:2000000';
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $rules;

View File

@ -29,8 +29,15 @@ class UploadBankTransactionRequest extends Request
{
$rules = [];
if ($this->input('documents')) {
$rules['documents'] = 'file|mimes:csv,png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:2000000';
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $rules;

View File

@ -38,14 +38,15 @@ class StoreClientRequest extends Request
public function rules()
{
if ($this->input('documents') && is_array($this->input('documents'))) {
$documents = count($this->input('documents'));
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
foreach (range(0, $documents) as $index) {
$rules['documents.'.$index] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
} elseif ($this->input('documents')) {
$rules['documents'] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
if (isset($this->number)) {

View File

@ -38,14 +38,15 @@ class UpdateClientRequest extends Request
{
/* Ensure we have a client name, and that all emails are unique*/
if ($this->input('documents') && is_array($this->input('documents'))) {
$documents = count($this->input('documents'));
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
foreach (range(0, $documents) as $index) {
$rules['documents.'.$index] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
} elseif ($this->input('documents')) {
$rules['documents'] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
$rules['company_logo'] = 'mimes:jpeg,jpg,png,gif|max:10000';

View File

@ -29,8 +29,15 @@ class UploadClientRequest extends Request
{
$rules = [];
if ($this->input('documents')) {
$rules['documents'] = 'file|mimes:csv,png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:2000000';
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $rules;

View File

@ -29,8 +29,15 @@ class UploadCompanyRequest extends Request
{
$rules = [];
if ($this->input('documents')) {
$rules['documents'] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $rules;

View File

@ -43,14 +43,15 @@ class StoreCreditRequest extends Request
{
$rules = [];
if ($this->input('documents') && is_array($this->input('documents'))) {
$documents = count($this->input('documents'));
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
foreach (range(0, $documents) as $index) {
$rules['documents.'.$index] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
} elseif ($this->input('documents')) {
$rules['documents'] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
$rules['client_id'] = 'required|exists:clients,id,company_id,'.auth()->user()->company()->id;

View File

@ -41,15 +41,16 @@ class UpdateCreditRequest extends Request
public function rules()
{
$rules = [];
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->input('documents') && is_array($this->input('documents'))) {
$documents = count($this->input('documents'));
foreach (range(0, $documents) as $index) {
$rules['documents.'.$index] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
} elseif ($this->input('documents')) {
$rules['documents'] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
if ($this->number) {

View File

@ -29,8 +29,15 @@ class UploadCreditRequest extends Request
{
$rules = [];
if ($this->input('documents')) {
$rules['documents'] = 'file|mimes:csv,png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:2000000';
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $rules;

View File

@ -46,6 +46,9 @@ class UpdateExpenseRequest extends Request
}
$rules['category_id'] = 'bail|sometimes|nullable|exists:expense_categories,id,company_id,'.auth()->user()->company()->id.',is_deleted,0';
$rules['transaction_id'] = 'bail|sometimes|nullable|exists:bank_transactions,id,company_id,'.auth()->user()->company()->id;
$rules['invoice_id'] = 'bail|sometimes|nullable|exists:invoices,id,company_id,'.auth()->user()->company()->id;
return $this->globalRules($rules);
}

View File

@ -29,8 +29,15 @@ class UploadExpenseRequest extends Request
{
$rules = [];
if ($this->input('documents')) {
$rules['documents'] = 'file|mimes:csv,png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:2000000';
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $rules;

View File

@ -29,10 +29,17 @@ class UploadGroupSettingRequest extends Request
{
$rules = [];
if ($this->input('documents')) {
$rules['documents'] = 'file|mimes:csv,png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:2000000';
}
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $rules;
}
}

View File

@ -37,24 +37,15 @@ class StoreInvoiceRequest extends Request
{
$rules = [];
if ($this->input('documents') && is_array($this->input('documents'))) {
$documents = count($this->input('documents'));
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
foreach (range(0, $documents) as $index) {
$rules['documents.'.$index] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
} elseif ($this->input('documents')) {
$rules['documents'] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
if ($this->input('file') && is_array($this->input('file'))) {
$documents = count($this->input('file'));
foreach (range(0, $documents) as $index) {
$rules['file.'.$index] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
} elseif ($this->input('file')) {
$rules['file'] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
$rules['client_id'] = 'bail|required|exists:clients,id,company_id,'.auth()->user()->company()->id.',is_deleted,0';

View File

@ -39,14 +39,15 @@ class UpdateInvoiceRequest extends Request
{
$rules = [];
if ($this->input('documents') && is_array($this->input('documents'))) {
$documents = count($this->input('documents'));
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
foreach (range(0, $documents) as $index) {
$rules['documents.'.$index] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
} elseif ($this->input('documents')) {
$rules['documents'] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
$rules['id'] = new LockedInvoiceRule($this->invoice);

View File

@ -29,14 +29,22 @@ class UploadInvoiceRequest extends Request
{
$rules = [];
if ($this->input('documents')) {
$rules['documents'] = 'file|mimes:csv,png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:2000000';
}
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->input('file')) {
$rules['file'] = 'file|mimes:csv,png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:2000000';
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $rules;
}
public function prepareForValidation()
{
}
}

View File

@ -113,16 +113,17 @@ class StorePaymentRequest extends Request
];
if ($this->input('documents') && is_array($this->input('documents'))) {
$documents = count($this->input('documents'));
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
foreach (range(0, $documents) as $index) {
$rules['documents.'.$index] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
} elseif ($this->input('documents')) {
$rules['documents'] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $rules;
}
}

View File

@ -38,23 +38,23 @@ class UpdatePaymentRequest extends Request
$rules = [
'invoices' => ['array', new PaymentAppliedValidAmount, new ValidCreditsPresentRule($this->all())],
'invoices.*.invoice_id' => 'distinct',
'documents' => 'mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx',
];
if ($this->number) {
$rules['number'] = Rule::unique('payments')->where('company_id', auth()->user()->company()->id)->ignore($this->payment->id);
}
if ($this->input('documents') && is_array($this->input('documents'))) {
$documents = count($this->input('documents'));
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
foreach (range(0, $documents) as $index) {
$rules['documents.'.$index] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
} elseif ($this->input('documents')) {
$rules['documents'] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $rules;
}

View File

@ -29,8 +29,15 @@ class UploadPaymentRequest extends Request
{
$rules = [];
if ($this->input('documents')) {
$rules['documents'] = 'file|mimes:csv,png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:2000000';
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $rules;

View File

@ -28,14 +28,15 @@ class StoreProductRequest extends Request
public function rules()
{
if ($this->input('documents') && is_array($this->input('documents'))) {
$documents = count($this->input('documents'));
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
foreach (range(0, $documents) as $index) {
$rules['documents.'.$index] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
} elseif ($this->input('documents')) {
$rules['documents'] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
$rules['cost'] = 'sometimes|numeric';

View File

@ -31,16 +31,17 @@ class UpdateProductRequest extends Request
public function rules()
{
if ($this->input('documents') && is_array($this->input('documents'))) {
$documents = count($this->input('documents'));
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
foreach (range(0, $documents) as $index) {
$rules['documents.'.$index] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
} elseif ($this->input('documents')) {
$rules['documents'] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
$rules['cost'] = 'numeric';
$rules['price'] = 'numeric';
$rules['quantity'] = 'numeric';

View File

@ -28,9 +28,15 @@ class UploadProductRequest extends Request
public function rules()
{
$rules = [];
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->input('documents')) {
$rules['documents'] = 'file|mimes:csv,png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:2000000';
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $rules;

View File

@ -11,6 +11,7 @@
namespace App\Http\Requests\Project;
use App\Models\Project;
use App\Http\Requests\Request;
class CreateProjectRequest extends Request
@ -22,6 +23,7 @@ class CreateProjectRequest extends Request
*/
public function authorize() : bool
{
return auth()->user()->isAdmin();
return auth()->user()->can('create', Project::class);
}
}

View File

@ -22,6 +22,6 @@ class DestroyProjectRequest extends Request
*/
public function authorize() : bool
{
return auth()->user()->isAdmin();
return auth()->user()->can('edit', $this->project);
}
}

View File

@ -22,7 +22,7 @@ class EditProjectRequest extends Request
*/
public function authorize() : bool
{
return auth()->user()->isAdmin();
return auth()->user()->can('edit', $this->project);
}
/**

View File

@ -22,7 +22,9 @@ class ShowProjectRequest extends Request
*/
public function authorize() : bool
{
return auth()->user()->isAdmin();
// return auth()->user()->isAdmin();
return auth()->user()->can('view', $this->project);
}
/**

View File

@ -42,6 +42,17 @@ class StoreProjectRequest extends Request
$rules['number'] = Rule::unique('projects')->where('company_id', auth()->user()->company()->id);
}
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $this->globalRules($rules);
}

View File

@ -37,6 +37,17 @@ class UpdateProjectRequest extends Request
$rules['number'] = Rule::unique('projects')->where('company_id', auth()->user()->company()->id)->ignore($this->project->id);
}
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $this->globalRules($rules);
}

View File

@ -29,8 +29,15 @@ class UploadProjectRequest extends Request
{
$rules = [];
if ($this->input('documents')) {
$rules['documents'] = 'file|mimes:csv,png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:2000000';
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $rules;

View File

@ -47,6 +47,17 @@ class StorePurchaseOrderRequest extends Request
$rules['is_amount_discount'] = ['boolean'];
$rules['line_items'] = 'array';
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $rules;
}

View File

@ -50,6 +50,17 @@ class UpdatePurchaseOrderRequest extends Request
$rules['discount'] = 'sometimes|numeric';
$rules['is_amount_discount'] = ['boolean'];
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $rules;
}

View File

@ -29,10 +29,17 @@ class UploadPurchaseOrderRequest extends Request
{
$rules = [];
if ($this->input('documents')) {
$rules['documents'] = 'file|mimes:csv,png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:2000000';
}
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $rules;
}
}

View File

@ -39,16 +39,17 @@ class StoreQuoteRequest extends Request
$rules['client_id'] = 'required|exists:clients,id,company_id,'.auth()->user()->company()->id;
if ($this->input('documents') && is_array($this->input('documents'))) {
$documents = count($this->input('documents'));
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
foreach (range(0, $documents) as $index) {
$rules['documents.'.$index] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
} elseif ($this->input('documents')) {
$rules['documents'] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
$rules['number'] = ['nullable', Rule::unique('quotes')->where('company_id', auth()->user()->company()->id)];
$rules['discount'] = 'sometimes|numeric';

View File

@ -37,16 +37,18 @@ class UpdateQuoteRequest extends Request
{
$rules = [];
if ($this->input('documents') && is_array($this->input('documents'))) {
$documents = count($this->input('documents'));
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
foreach (range(0, $documents) as $index) {
$rules['documents.'.$index] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
} elseif ($this->input('documents')) {
$rules['documents'] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
if ($this->number) {
$rules['number'] = Rule::unique('quotes')->where('company_id', auth()->user()->company()->id)->ignore($this->quote->id);
}

View File

@ -28,9 +28,16 @@ class UploadQuoteRequest extends Request
public function rules()
{
$rules = [];
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->input('documents')) {
$rules['documents'] = 'file|mimes:csv,png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:2000000';
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $rules;

View File

@ -48,6 +48,17 @@ class StoreRecurringExpenseRequest extends Request
$rules['tax_amount2'] = 'numeric';
$rules['tax_amount3'] = 'numeric';
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $this->globalRules($rules);
}

View File

@ -48,6 +48,17 @@ class UpdateRecurringExpenseRequest extends Request
$rules['tax_amount3'] = 'numeric';
$rules['category_id'] = 'bail|nullable|sometimes|exists:expense_categories,id,company_id,'.auth()->user()->company()->id.',is_deleted,0';
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $this->globalRules($rules);
}

View File

@ -29,8 +29,15 @@ class UploadRecurringExpenseRequest extends Request
{
$rules = [];
if ($this->input('documents')) {
$rules['documents'] = 'file|mimes:csv,png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:2000000';
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $rules;

View File

@ -38,14 +38,15 @@ class StoreRecurringInvoiceRequest extends Request
{
$rules = [];
if ($this->input('documents') && is_array($this->input('documents'))) {
$documents = count($this->input('documents'));
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
foreach (range(0, $documents) as $index) {
$rules['documents.'.$index] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
} elseif ($this->input('documents')) {
$rules['documents'] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
$rules['client_id'] = 'required|exists:clients,id,company_id,'.auth()->user()->company()->id;

View File

@ -38,14 +38,15 @@ class UpdateRecurringInvoiceRequest extends Request
{
$rules = [];
if ($this->input('documents') && is_array($this->input('documents'))) {
$documents = count($this->input('documents'));
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
foreach (range(0, $documents) as $index) {
$rules['documents.'.$index] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
} elseif ($this->input('documents')) {
$rules['documents'] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
if ($this->number) {

View File

@ -29,10 +29,17 @@ class UploadRecurringInvoiceRequest extends Request
{
$rules = [];
if ($this->input('documents')) {
$rules['documents'] = 'file|mimes:csv,png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:2000000';
}
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $rules;
}
}

View File

@ -36,15 +36,16 @@ class StoreRecurringQuoteRequest extends Request
public function rules()
{
$rules = [];
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->input('documents') && is_array($this->input('documents'))) {
$documents = count($this->input('documents'));
foreach (range(0, $documents) as $index) {
$rules['documents.'.$index] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
} elseif ($this->input('documents')) {
$rules['documents'] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
$rules['client_id'] = 'required|exists:clients,id,company_id,'.auth()->user()->company()->id;

View File

@ -37,16 +37,17 @@ class UpdateRecurringQuoteRequest extends Request
{
$rules = [];
if ($this->input('documents') && is_array($this->input('documents'))) {
$documents = count($this->input('documents'));
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
foreach (range(0, $documents) as $index) {
$rules['documents.'.$index] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
}
} elseif ($this->input('documents')) {
$rules['documents'] = 'file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
if ($this->number) {
$rules['number'] = Rule::unique('recurring_quotes')->where('company_id', auth()->user()->company()->id)->ignore($this->recurring_quote->id);
}

View File

@ -29,10 +29,17 @@ class UploadRecurringQuoteRequest extends Request
{
$rules = [];
if ($this->input('documents')) {
$rules['documents'] = 'file|mimes:csv,png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:2000000';
}
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $rules;
}
}

View File

@ -20,6 +20,7 @@ class Request extends FormRequest
use MakesHash;
use RuntimeFormRequest;
protected $file_validation = 'sometimes|file|mimes:png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:20000';
/**
* Get the validation rules that apply to the request.
*
@ -124,6 +125,10 @@ class Request extends FormRequest
$input['company_gateway_id'] = $this->decodePrimaryKey($input['company_gateway_id']);
}
if (array_key_exists('transaction_id', $input) && is_string($input['transaction_id'])) {
$input['transaction_id'] = $this->decodePrimaryKey($input['transaction_id']);
}
if (array_key_exists('category_id', $input) && is_string($input['category_id'])) {
$input['category_id'] = $this->decodePrimaryKey($input['category_id']);
}

View File

@ -58,6 +58,17 @@ class StoreTaskRequest extends Request
$fail('Please correct overlapping values');
}
}];
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $this->globalRules($rules);

View File

@ -30,7 +30,6 @@ class UpdateTaskRequest extends Request
*/
public function authorize() : bool
{
nlog("oioi");
//prevent locked tasks from updating
if ($this->task->invoice_id && $this->task->company->invoice_task_lock) {
return false;
@ -67,6 +66,17 @@ class UpdateTaskRequest extends Request
}
}];
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $this->globalRules($rules);
}

View File

@ -22,6 +22,6 @@ class DestroySchedulerRequest extends Request
*/
public function authorize() : bool
{
return auth()->user()->isAdmin();
return auth()->user()->isAdmin() && $this->task_scheduler->company_id == auth()->user()->company()->id;
}
}

View File

@ -47,6 +47,16 @@ class StoreVendorRequest extends Request
$rules['currency_id'] = 'bail|required|exists:currencies,id';
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $rules;
}

View File

@ -44,6 +44,17 @@ class UpdateVendorRequest extends Request
$rules['contacts.*.email'] = 'nullable|distinct';
$rules['currency_id'] = 'bail|sometimes|exists:currencies,id';
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $rules;
}

View File

@ -29,8 +29,15 @@ class UploadVendorRequest extends Request
{
$rules = [];
if ($this->input('documents')) {
$rules['documents'] = 'file|mimes:csv,png,ai,jpeg,tiff,pdf,gif,psd,txt,doc,xls,ppt,xlsx,docx,pptx|max:2000000';
if($this->file('documents') && is_array($this->file('documents')))
$rules['documents.*'] = $this->file_validation;
elseif($this->file('documents'))
$rules['documents'] = $this->file_validation;
if ($this->file('file') && is_array($this->file('file'))) {
$rules['file.*'] = $this->file_validation;
} elseif ($this->file('file')) {
$rules['file'] = $this->file_validation;
}
return $rules;

View File

@ -32,7 +32,8 @@ use Illuminate\Database\Eloquent\SoftDeletes;
class Scheduler extends BaseModel
{
use SoftDeletes;
use Filterable;
protected $fillable = [
'name',
'frequency_id',

View File

@ -12,16 +12,17 @@
namespace App\PaymentDrivers\Stripe;
use App\Models\Payment;
use App\Models\SystemLog;
use Stripe\PaymentIntent;
use App\Models\GatewayType;
use App\Models\PaymentType;
use App\Jobs\Util\SystemLogger;
use App\Utils\Traits\MakesHash;
use App\Exceptions\PaymentFailed;
use App\PaymentDrivers\StripePaymentDriver;
use App\Http\Requests\ClientPortal\Payments\PaymentResponseRequest;
use App\Jobs\Util\SystemLogger;
use App\Models\GatewayType;
use App\Models\Payment;
use App\Models\PaymentType;
use App\Models\SystemLog;
use App\PaymentDrivers\StripePaymentDriver;
use App\Utils\Number;
use App\Utils\Traits\MakesHash;
use Stripe\PaymentIntent;
class BankTransfer
{
@ -68,7 +69,7 @@ class BankTransfer
$data['return_url'] = $this->buildReturnUrl();
$data['gateway'] = $this->stripe;
$data['client_secret'] = $intent ? $intent->client_secret : false;
return render('gateways.stripe.bank_transfer.pay', $data);
}
@ -79,14 +80,12 @@ class BankTransfer
*/
private function resolveBankType()
{
return match($this->stripe->client->currency()->code){
return match ($this->stripe->client->currency()->code) {
'GBP' => ['type' => 'gb_bank_transfer'],
'EUR' => ['type' => 'eu_bank_transfer', 'eu_bank_transfer' => ['country' => $this->stripe->client->country->iso_3166_2]],
'JPY' => ['type' => 'jp_bank_transfer'],
'MXN' => ['type' =>'mx_bank_transfer'],
};
}
/**
@ -103,59 +102,145 @@ class BankTransfer
]);
}
/**
* paymentResponse
*
* @param mixed $request
* @return void
*/
public function paymentResponse(PaymentResponseRequest $request)
{
$this->stripe->init();
$this->stripe->setPaymentHash($request->getPaymentHash());
$this->stripe->client = $this->stripe->payment_hash->fee_invoice->client;
if($request->payment_intent){
if ($request->payment_intent) {
$pi = \Stripe\PaymentIntent::retrieve(
$request->payment_intent,
$this->stripe->stripe_connect_auth
);
if (in_array($pi->status, ['succeeded', 'processing'])) {
return $this->processSuccesfulRedirect($pi);
$payment = $this->processSuccesfulRedirect($pi);
redirect()->route('client.payments.show', ['payment' => $this->stripe->encodePrimaryKey($payment->id)]);
}
/* Create a pending payment */
if($pi->status == 'requires_action') {
if ($pi->status == 'requires_action' && $pi->next_action->type == 'display_bank_transfer_instructions') {
match ($pi->next_action->display_bank_transfer_instructions->currency) {
'mxn' => $data['bank_details'] = $this->formatDataforMx($pi),
'gbp' => $data['bank_details'] = $this->formatDataforUk($pi),
'eur' => $data['bank_details'] = $this->formatDataforEur($pi),
'jpy' => $data['bank_details'] = $this->formatDataforJp($pi),
};
$payment = $this->processSuccesfulRedirect($pi);
$data = [
'payment_method' => $pi->payment_method,
'payment_type' => PaymentType::DIRECT_DEBIT,
'amount' => $this->stripe->convertFromStripeAmount($this->stripe->payment_hash->data->stripe_amount, $this->stripe->client->currency()->precision, $this->stripe->client->currency()),
'transaction_reference' => $pi->id,
'gateway_type_id' => GatewayType::DIRECT_DEBIT,
return render('gateways.stripe.bank_transfer.bank_details_container', $data);
}
return $this->processUnsuccesfulRedirect();
}
}
/**
* formatDataForUk
*
* @param PaymentIntent $pi
* @return array
*/
public function formatDataForUk(PaymentIntent $pi): array
{
return [
'amount' => Number::formatMoney($this->stripe->convertFromStripeAmount($pi->next_action->display_bank_transfer_instructions->amount_remaining, $this->stripe->client->currency()->precision, $this->stripe->client->currency()), $this->stripe->client),
'account_holder_name' => $pi->next_action->display_bank_transfer_instructions->financial_addresses[0]->sort_code->account_holder_name,
'account_number' => $pi->next_action->display_bank_transfer_instructions->financial_addresses[0]->sort_code->account_number,
'sort_code' => $pi->next_action->display_bank_transfer_instructions->financial_addresses[0]->sort_code->sort_code,
'reference' => $pi->next_action->display_bank_transfer_instructions->reference,
'description' => $pi->description,
'gateway' => $this->stripe->company_gateway,
'currency' => $pi->next_action->display_bank_transfer_instructions->currency,
];
}
/**
* formatDataforMx
*
* @param PaymentIntent $pi
* @return array
*/
public function formatDataforMx(PaymentIntent $pi): array
{
return [
'amount' => Number::formatMoney($this->stripe->convertFromStripeAmount($pi->next_action->display_bank_transfer_instructions->amount_remaining, $this->stripe->client->currency()->precision, $this->stripe->client->currency()), $this->stripe->client),
'account_holder_name' => $pi->next_action->display_bank_transfer_instructions->financial_addresses[0]->spei->bank_name,
'account_number' => $pi->next_action->display_bank_transfer_instructions->financial_addresses[0]->spei->bank_code,
'sort_code' => $pi->next_action->display_bank_transfer_instructions->financial_addresses[0]->spei->clabe,
'reference' => $pi->next_action->display_bank_transfer_instructions->reference,
'description' => $pi->description,
'gateway' => $this->stripe->company_gateway,
'currency' => $pi->next_action->display_bank_transfer_instructions->currency,
$payment = $this->stripe->createPayment($data, Payment::STATUS_PENDING);
SystemLogger::dispatch(
['response' => $this->stripe->payment_hash->data, 'data' => $data],
SystemLog::CATEGORY_GATEWAY_RESPONSE,
SystemLog::EVENT_GATEWAY_SUCCESS,
SystemLog::TYPE_STRIPE,
$this->stripe->client,
$this->stripe->client->company,
);
return redirect($pi->next_action->display_bank_transfer_instructions->hosted_instructions_url);
}
return $this->processUnsuccesfulRedirect();
}
];
}
public function processSuccesfulRedirect($payment_intent)
/**
* formatDataforEur
*
* @param mixed $pi
* @return array
*/
public function formatDataforEur(PaymentIntent $pi): array
{
return [
'amount' => Number::formatMoney($this->stripe->convertFromStripeAmount($pi->next_action->display_bank_transfer_instructions->amount_remaining, $this->stripe->client->currency()->precision, $this->stripe->client->currency()), $this->stripe->client),
'account_holder_name' => $pi->next_action->display_bank_transfer_instructions->financial_addresses[0]->iban->account_holder_name,
'account_number' => $pi->next_action->display_bank_transfer_instructions->financial_addresses[0]->iban->iban,
'sort_code' => $pi->next_action->display_bank_transfer_instructions->financial_addresses[0]->iban->bic,
'reference' => $pi->next_action->display_bank_transfer_instructions->reference,
'description' => $pi->description,
'gateway' => $this->stripe->company_gateway,
'currency' => $pi->next_action->display_bank_transfer_instructions->currency,
];
}
/**
*
* @param PaymentIntent $pi
* @return array
*/
public function formatDataforJp(PaymentIntent $pi): array
{
return [
'amount' => Number::formatMoney($this->stripe->convertFromStripeAmount($pi->next_action->display_bank_transfer_instructions->amount_remaining, $this->stripe->client->currency()->precision, $this->stripe->client->currency()), $this->stripe->client),
'account_holder_name' => $pi->next_action->display_bank_transfer_instructions->financial_addresses[0]->zengin->account_holder_name,
'account_number' => $pi->next_action->display_bank_transfer_instructions->financial_addresses[0]->zengin->account_number,
'account_type' =>$pi->next_action->display_bank_transfer_instructions->financial_addresses[0]->zengin->account_type,
'bank_code' =>$pi->next_action->display_bank_transfer_instructions->financial_addresses[0]->zengin->bank_code,
'bank_name' =>$pi->next_action->display_bank_transfer_instructions->financial_addresses[0]->zengin->bank_name,
'branch_code' =>$pi->next_action->display_bank_transfer_instructions->financial_addresses[0]->zengin->branch_code,
'branch_name' =>$pi->next_action->display_bank_transfer_instructions->financial_addresses[0]->zengin->branch_name,
'reference' => $pi->next_action->display_bank_transfer_instructions->reference,
'description' => $pi->description,
'gateway' => $this->stripe->company_gateway,
'currency' => $pi->next_action->display_bank_transfer_instructions->currency,
];
}
/**
* processSuccesfulRedirect
*
* @param PaymentIntent $payment_intent
* @return Payment
*/
public function processSuccesfulRedirect(PaymentIntent $payment_intent): Payment
{
$this->stripe->init();
@ -168,7 +253,7 @@ class BankTransfer
];
$payment = $this->stripe->createPayment($data, $payment_intent->status == 'processing' ? Payment::STATUS_PENDING : Payment::STATUS_COMPLETED);
$payment = $this->stripe->createPayment($data, $payment_intent->status == 'succeeded' ? Payment::STATUS_COMPLETED : Payment::STATUS_PENDING);
SystemLogger::dispatch(
['response' => $this->stripe->payment_hash->data, 'data' => $data],
@ -179,9 +264,14 @@ class BankTransfer
$this->stripe->client->company,
);
return redirect()->route('client.payments.show', ['payment' => $this->stripe->encodePrimaryKey($payment->id)]);
return $payment;
}
/**
* processUnsuccesfulRedirect
*
* @return void
*/
public function processUnsuccesfulRedirect()
{
$server_response = $this->stripe->payment_hash->data;
@ -204,6 +294,4 @@ class BankTransfer
throw new PaymentFailed('Failed to process the payment.', 500);
}
}
}

View File

@ -52,7 +52,6 @@ use App\PaymentDrivers\Stripe\PRZELEWY24;
use App\PaymentDrivers\Stripe\BankTransfer;
use App\PaymentDrivers\Stripe\Connect\Verify;
use App\PaymentDrivers\Stripe\ImportCustomers;
use App\PaymentDrivers\Stripe\UpdatePaymentMethods;
use App\Http\Requests\Payments\PaymentWebhookRequest;
use Laracasts\Presenter\Exceptions\PresenterException;
use App\PaymentDrivers\Stripe\Jobs\PaymentIntentWebhook;
@ -155,7 +154,7 @@ class StripePaymentDriver extends BaseDriver
if ($this->client
&& isset($this->client->country)
&& in_array($this->client->country->iso_3166_3, ['USA'])
&& (in_array($this->client->country->iso_3166_3, ['USA']) || ($this->client->gateway_tokens()->where('gateway_type_id', GatewayType::BANK_TRANSFER)->exists()))
) {
$types[] = GatewayType::BANK_TRANSFER;
}
@ -261,7 +260,12 @@ class StripePaymentDriver extends BaseDriver
if (
$this->client
&& isset($this->client->country)
&& in_array($this->client->country->iso_3166_2, ['FR', 'IE', 'NL', 'GB', 'DE', 'ES', 'JP', 'MX'])
&& (
(in_array($this->client->country->iso_3166_2, ['FR', 'IE', 'NL', 'DE', 'ES']) && $this->client->currency()->code == 'EUR') ||
($this->client->country->iso_3166_2 == 'JP' && $this->client->currency()->code == 'JPY') ||
($this->client->country->iso_3166_2 == 'MX' && $this->client->currency()->code == 'MXN') ||
($this->client->country->iso_3166_2 == 'GB' && $this->client->currency()->code == 'GBP')
)
) {
$types[] = GatewayType::DIRECT_DEBIT;
}
@ -434,6 +438,17 @@ class StripePaymentDriver extends BaseDriver
return PaymentIntent::create($data, array_merge($meta, ['idempotency_key' => uniqid("st", true)]));
}
public function getPaymentIntent($payment_intent_id): ?PaymentIntent
{
$this->init();
return PaymentIntent::retrieve(
$payment_intent_id,
$this->stripe_connect_auth
);
}
/**
* Returns a setup intent that allows the user
* to enter card details without initiating a transaction.
@ -843,15 +858,6 @@ class StripePaymentDriver extends BaseDriver
$this->client = ClientGatewayToken::where('gateway_customer_reference', $customer)->client;
}
/**
* Pull all client payment methods and update
* the respective tokens in the system.
*/
public function updateAllPaymentMethods()
{
return (new UpdatePaymentMethods($this))->run();
}
/**
* Imports stripe customers and their payment methods
* Matches users in the system based on the $match_on_record

View File

@ -840,8 +840,8 @@ class Design extends BaseDesign
['element' => 'span', 'content' => strtr(str_replace("labels", "", $_variables['values']['$entity.terms']), $_variables['labels']), 'properties' => ['data-ref' => 'total_table-terms', 'style' => 'text-align: left;']],
]],
['element' => 'img', 'properties' => ['style' => 'max-width: 50%; height: auto;', 'src' => '$contact.signature', 'id' => 'contact-signature']],
['element' => 'div', 'properties' => ['style' => 'margin-top: 1.5rem; display: flex; align-items: flex-start; page-break-inside: auto;'], 'elements' => [
['element' => 'img', 'properties' => ['src' => '$invoiceninja.whitelabel', 'style' => 'height: 2.5rem;', 'hidden' => $this->entity->user->account->isPaid() ? 'true' : 'false', 'id' => 'invoiceninja-whitelabel-logo']],
['element' => 'div', 'properties' => ['style' => 'display: flex; align-items: flex-start; page-break-inside: auto;'], 'elements' => [
['element' => 'img', 'properties' => ['src' => '$invoiceninja.whitelabel', 'style' => 'height: 2.5rem; margin-top: 1.5rem;', 'hidden' => $this->entity->user->account->isPaid() ? 'true' : 'false', 'id' => 'invoiceninja-whitelabel-logo']],
]],
]],
['element' => 'div', 'properties' => ['class' => 'totals-table-right-side', 'dir' => '$dir'], 'elements' => []],

View File

@ -152,7 +152,7 @@ class HtmlEngine
$data['$payment_button'] = ['value' => $this->buildViewButton($this->invitation->getPaymentLink(), ctrans('texts.pay_now')), 'label' => ctrans('texts.pay_now')];
$data['$payment_link'] = ['value' => $this->invitation->getPaymentLink(), 'label' => ctrans('texts.pay_now')];
$data['$payment_qrcode'] = ['value' => $this->invitation->getPaymentQrCode(), 'label' => ctrans('texts.pay_now')];
$data['$exchange_rate'] = ['value' => $this->entity->exchange_rate ?: '&nbsp;', 'label' => ctrans('texts.exchange_rate')];
if ($this->entity_string == 'invoice' || $this->entity_string == 'recurring_invoice') {
$data['$entity'] = ['value' => '', 'label' => ctrans('texts.invoice')];

View File

@ -32,6 +32,7 @@ class SystemHealth
'mbstring',
'xml',
'bcmath',
'iconv',
];
private static $php_version = 8.1;

View File

@ -117,6 +117,62 @@ class RandomDataSeeder extends Seeder
'settings' => null,
]);
$user = User::firstOrNew([
'email' => 'user@example.com',
]);
$user->password = Hash::make('password');
$user->account_id = $account->id;
$user->email_verified_at = now();
$user->save();
$user->companies()->attach($company->id, [
'account_id' => $account->id,
'is_owner' => 1,
'is_admin' => 1,
'is_locked' => 0,
'notifications' => CompanySettings::notificationDefaults(),
'permissions' => '',
'settings' => null,
]);
$company_token = CompanyToken::create([
'user_id' => $user->id,
'company_id' => $company->id,
'account_id' => $account->id,
'name' => 'test token',
'token' => \Illuminate\Support\Str::random(64),
]);
$user = User::firstOrNew([
'email' => 'permissions@example.com',
]);
$user->password = Hash::make('password');
$user->account_id = $account->id;
$user->email_verified_at = now();
$user->save();
$company_token = CompanyToken::create([
'user_id' => $user->id,
'company_id' => $company->id,
'account_id' => $account->id,
'name' => 'test token',
'token' => \Illuminate\Support\Str::random(64),
]);
$user->companies()->attach($company->id, [
'account_id' => $account->id,
'is_owner' => 0,
'is_admin' => 0,
'is_locked' => 0,
'notifications' => CompanySettings::notificationDefaults(),
'permissions' => '',
'settings' => null,
]);
$client = Client::factory()->create([
'user_id' => $user->id,
'company_id' => $company->id,

View File

@ -5001,6 +5001,13 @@ $LANG = array(
'gateway_payment_text_no_invoice' => 'Payment with no invoice for amount :amount for client :client',
'click_to_variables' => 'Client here to see all variables.',
'ship_to' => 'Ship to',
'stripe_direct_debit_details' => 'Please transfer into the nominated bank account above.',
'branch_name' => 'Branch Name',
'branch_code' => 'Branch Code',
'bank_name' => 'Bank Name',
'bank_code' => 'Bank Code',
'bic' => 'BIC',
);

View File

@ -298,8 +298,8 @@ const RESOURCES = {
"assets/NOTICES": "1a34e70168d56fad075adfb4bdbb20eb",
"assets/fonts/MaterialIcons-Regular.otf": "95db9098c58fd6db106f1116bae85a0b",
"assets/AssetManifest.json": "759f9ef9973f7e26c2a51450b55bb9fa",
"/": "384d4eeaffc3b89569c9be891a7fb2fd",
"main.dart.js": "13599a5a8e48bf01695e00ebafc2bbd1",
"/": "f935af908f5ebe2ec18aef350de81f6c",
"main.dart.js": "92c2392e1b819b43c76072ddda82f371",
"icons/Icon-512.png": "0f9aff01367f0a0c69773d25ca16ef35",
"icons/Icon-192.png": "bb1cf5f6982006952211c7c8404ffbed"
};

287841
public/main.dart.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

277037
public/main.foss.dart.js vendored

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,221 @@
<div class="mt-4 overflow-hidden bg-white shadow sm:rounded-lg">
<div class="px-4 py-5 border-b border-gray-200 sm:px-6">
<h3 class="text-lg font-medium leading-6 text-gray-900">
{{ ctrans('texts.bank_transfer') }}
</h3>
</div>
<div class="container mx-auto">
<div class="px-4 py-5 bg-white sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6">
@if($bank_details['currency'] == 'gbp')
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.sort') }}
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['sort_code'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.account_number') }}
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['account_number'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.account_name') }}
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['account_holder_name'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.reference') }}
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['reference'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.balance_due') }}
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['amount'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ ctrans('texts.stripe_direct_debit_details') }}
</dd>
@elseif($bank_details['currency'] == 'mxn')
<dt class="text-sm font-medium leading-5 text-gray-500">
Clabe
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['sort_code'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.account_number') }}
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['account_number'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.account_name') }}
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['account_holder_name'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.reference') }}
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['reference'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.balance_due') }}
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['amount'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ ctrans('texts.stripe_direct_debit_details') }}
</dd>
@elseif($bank_details['currency'] == 'jpy')
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.account_number') }}
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['account_number'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.account_name') }}
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['account_holder_name'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.account_type') }}
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['account_type'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.bank_name') }}
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['bank_name'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.bank_code') }}
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['bank_code'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.branch_name') }}
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['branch_name'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.branch_code') }}
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['branch_code'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.reference') }}
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['reference'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.balance_due') }}
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['amount'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ ctrans('texts.stripe_direct_debit_details') }}
</dd>
@elseif($bank_details['currency'] == 'eur')
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.account_name') }}
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['account_holder_name'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.account_number') }}
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['account_number'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.bic') }}
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['sort_code'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.reference') }}
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['reference'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
{{ ctrans('texts.balance_due') }}
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ $bank_details['amount'] }}
</dd>
<dt class="text-sm font-medium leading-5 text-gray-500">
</dt>
<dd class="mt-1 text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
{{ ctrans('texts.stripe_direct_debit_details') }}
</dd>
@endif
</div>
</div>
</div>

View File

@ -0,0 +1,5 @@
@extends('portal.ninja2020.layout.app')
@section('meta_title', ctrans('texts.bank_transfer'))
@include('portal.ninja2020.gateways.stripe.bank_transfer.bank_details')

View File

@ -17,7 +17,7 @@
<form action="{{ route('client.payments.response') }}" method="post" id="payment-form">
@csrf
<div id="payment-element">
<div id="payment-element" style="padding:40px;">
<!-- Elements will create form elements here -->
</div>
@ -46,19 +46,22 @@
<script>
const options = {
clientSecret: '{{ $client_secret }}',
style: {
base: {
padding: '10px 12px',
color: '#32325d',
fontSize: '16px',
'::placeholder': {
color: '#aab7c4'
},
},
},
appearance : {
theme: 'stripe',
variables: {
colorPrimary: '#0570de',
colorBackground: '#ffffff',
colorText: '#30313d',
colorDanger: '#df1b41',
fontFamily: 'Ideal Sans, system-ui, sans-serif',
spacingUnit: '2px',
borderRadius: '4px',
// See all possible variables below
}
}
};
const stripe = Stripe(document.querySelector('meta[name="stripe-publishable-key"]').getAttribute('content'));
const stripeConnect = document.querySelector('meta[name="stripe-account-id"]')?.content ?? '';

View File

@ -8,7 +8,6 @@
$token_billing_string = 'false';
}
@endphp
@section('gateway_head')

View File

@ -122,6 +122,12 @@
@endforeach
</dl>
</div>
<!-- if this is a stripe bank transfer - show the required details here: -->
</div>
@if($bank_details)
@include('portal.ninja2020.gateways.stripe.bank_transfer.bank_details')
@endif
</div>
@endsection

View File

@ -54,7 +54,31 @@ class SchedulerTest extends TestCase
);
}
public function testSchedulerGet3()
{
$scheduler = SchedulerFactory::create($this->company->id, $this->user->id);
$scheduler->name = "hello";
$scheduler->save();
$scheduler = SchedulerFactory::create($this->company->id, $this->user->id);
$scheduler->name = "goodbye";
$scheduler->save();
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token,
])->get('/api/v1/task_schedulers?filter=hello');
$response->assertStatus(200);
$arr = $response->json();
$this->assertEquals('hello', $arr['data'][0]['name']);
$this->assertCount(1, $arr['data']);
}
public function testSchedulerGet2()
{