mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-07-09 03:14:30 -04:00
Merge pull request #7477 from turbo124/v5-develop
Fixes for openAPI schema
This commit is contained in:
commit
f9ffffb366
88
app/Console/Commands/ReactBuilder.php
Normal file
88
app/Console/Commands/ReactBuilder.php
Normal file
@ -0,0 +1,88 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Invoice Ninja (https://invoiceninja.com).
|
||||||
|
*
|
||||||
|
* @link https://github.com/invoiceninja/invoiceninja source repository
|
||||||
|
*
|
||||||
|
* @copyright Copyright (c) 2022. Invoice Ninja LLC (https://invoiceninja.com)
|
||||||
|
*
|
||||||
|
* @license https://www.elastic.co/licensing/elastic-license
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace App\Console\Commands;
|
||||||
|
|
||||||
|
use App\Libraries\MultiDB;
|
||||||
|
use App\Models\Backup;
|
||||||
|
use App\Models\Design;
|
||||||
|
use Illuminate\Console\Command;
|
||||||
|
use Illuminate\Support\Facades\Storage;
|
||||||
|
use stdClass;
|
||||||
|
|
||||||
|
class ReactBuilder extends Command
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The name and signature of the console command.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $signature = 'ninja:react';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The console command description.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $description = 'Builds blade component for react includes';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new command instance.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
parent::__construct();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the console command.
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
$includes = '';
|
||||||
|
|
||||||
|
$directoryIterator = new \RecursiveDirectoryIterator(public_path('react'), \RecursiveDirectoryIterator::SKIP_DOTS);
|
||||||
|
|
||||||
|
foreach (new \RecursiveIteratorIterator($directoryIterator) as $file) {
|
||||||
|
|
||||||
|
if(str_contains($file->getFileName(), '.js')) {
|
||||||
|
|
||||||
|
if(str_contains($file->getFileName(), 'index.')){
|
||||||
|
|
||||||
|
$includes .= '<script type="module" crossorigin src="/react/' . $file->getFileName() . '"></script>'."\n";
|
||||||
|
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
|
||||||
|
$includes .= '<link rel="modulepreload" href="/react/' . $file->getFileName() . '">'."\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if(str_contains($file->getFileName(), '.css')) {
|
||||||
|
|
||||||
|
$includes .= '<link rel="stylesheet" href="/react/' . $file->getFileName() . '">'."\n";
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
file_put_contents(resource_path('views/react/head.blade.php'), $includes);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
@ -77,10 +77,9 @@ class Kernel extends ConsoleKernel
|
|||||||
$schedule->job(new TaskScheduler())->daily()->withoutOverlapping();
|
$schedule->job(new TaskScheduler())->daily()->withoutOverlapping();
|
||||||
|
|
||||||
$schedule->job(new SystemMaintenance)->weekly()->withoutOverlapping();
|
$schedule->job(new SystemMaintenance)->weekly()->withoutOverlapping();
|
||||||
|
|
||||||
if(Ninja::isSelfHost())
|
if(Ninja::isSelfHost())
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
$schedule->call(function () {
|
$schedule->call(function () {
|
||||||
Account::whereNotNull('id')->update(['is_scheduler_running' => true]);
|
Account::whereNotNull('id')->update(['is_scheduler_running' => true]);
|
||||||
})->everyFiveMinutes();
|
})->everyFiveMinutes();
|
||||||
|
@ -81,7 +81,7 @@ abstract class QueryFilters
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strlen($value)) {
|
if (is_string($value) && strlen($value)) {
|
||||||
$this->$name($value);
|
$this->$name($value);
|
||||||
} else {
|
} else {
|
||||||
$this->$name();
|
$this->$name();
|
||||||
|
@ -91,6 +91,30 @@ class ActivityController extends BaseController
|
|||||||
$activities = Activity::orderBy('created_at', 'DESC')->company()
|
$activities = Activity::orderBy('created_at', 'DESC')->company()
|
||||||
->take($default_activities);
|
->take($default_activities);
|
||||||
|
|
||||||
|
if($request->has('react')){
|
||||||
|
|
||||||
|
$system = ctrans('texts.system');
|
||||||
|
|
||||||
|
$data = $activities->cursor()->map(function ($activity) use($system){
|
||||||
|
|
||||||
|
return ctrans('texts.activity_'.$activity->activity_type_id,[
|
||||||
|
'client' => $activity->client ? $activity->client->present()->name() : $system,
|
||||||
|
'contact' => $activity->contact ? $activity->contact->first_name . " " .$activity->contact->last_name : $system,
|
||||||
|
'quote' => $activity->quote ? $activity->quote->number : $system,
|
||||||
|
'user' => $activity->user ? $activity->user->present()->name() : $system,
|
||||||
|
'expense' => $activity->expense ? $activity->expense->number : $system,
|
||||||
|
'invoice' => $activity->invoice ? $activity->invoice->number : $system,
|
||||||
|
'recurring_invoice' => $activity->recurring_invoice ? $activity->recurring_invoice->number : $system,
|
||||||
|
'payment' => $activity->payment ? $activity->payment->number : $system,
|
||||||
|
'credit' => $activity->credit ? $activity->credit->number : $system,
|
||||||
|
'task' => $activity->task ? $activity->task->number : $system,
|
||||||
|
]);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
return response()->json(['data' => $data->toArray()], 200);
|
||||||
|
}
|
||||||
|
|
||||||
return $this->listResponse($activities);
|
return $this->listResponse($activities);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -780,7 +780,10 @@ class BaseController extends Controller
|
|||||||
|
|
||||||
$this->buildCache();
|
$this->buildCache();
|
||||||
|
|
||||||
return response()->view('index.index', $data)->header('X-Frame-Options', 'SAMEORIGIN', false);
|
if(config('ninja.react_app_enabled'))
|
||||||
|
return response()->view('react.index', $data)->header('X-Frame-Options', 'SAMEORIGIN', false);
|
||||||
|
else
|
||||||
|
return response()->view('index.index', $data)->header('X-Frame-Options', 'SAMEORIGIN', false);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,13 +125,14 @@ class NinjaPlanController extends Controller
|
|||||||
$gateway_driver->storeGatewayToken($data, ['gateway_customer_reference' => $customer->id]);
|
$gateway_driver->storeGatewayToken($data, ['gateway_customer_reference' => $customer->id]);
|
||||||
|
|
||||||
//set free trial
|
//set free trial
|
||||||
// $account = auth()->guard('contact')->user()->company->account;
|
|
||||||
if(auth()->guard('contact')->user()->client->custom_value2){
|
if(auth()->guard('contact')->user()->client->custom_value2){
|
||||||
MultiDB::findAndSetDbByAccountKey(auth()->guard('contact')->user()->client->custom_value2);
|
MultiDB::findAndSetDbByAccountKey(auth()->guard('contact')->user()->client->custom_value2);
|
||||||
$account = Account::where('key', auth()->guard('contact')->user()->client->custom_value2)->first();
|
$account = Account::where('key', auth()->guard('contact')->user()->client->custom_value2)->first();
|
||||||
$account->trial_started = now();
|
$account->trial_started = now();
|
||||||
$account->trial_plan = 'pro';
|
$account->trial_plan = 'pro';
|
||||||
$account->plan = 'pro';
|
$account->plan = 'pro';
|
||||||
|
$account->plan_term = 'month';
|
||||||
|
$account->plan_started = now();
|
||||||
$account->plan_expires = now()->addDays(14);
|
$account->plan_expires = now()->addDays(14);
|
||||||
$account->save();
|
$account->save();
|
||||||
}
|
}
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* type="object",
|
* type="object",
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
* @OA\Property(property="paused",type="bool",example="false",description="The scheduler paused state"),
|
* @OA\Property(property="paused",type="boolean",example="false",description="The scheduler paused state"),
|
||||||
* @OA\Property(property="repeat_every",type="string",example="DAY",description="Accepted values (DAY,WEEK,MONTH,3MONTHS,YEAR)"),
|
* @OA\Property(property="repeat_every",type="string",example="DAY",description="Accepted values (DAY,WEEK,MONTH,3MONTHS,YEAR)"),
|
||||||
* @OA\Property(property="start_from",type="integer",example="1652898504",description="Timestamp when we should start the scheduler, default is today"),
|
* @OA\Property(property="start_from",type="integer",example="1652898504",description="Timestamp when we should start the scheduler, default is today"),
|
||||||
* @OA\Property(property="date_range", type="string", example="last7", description="The string representation of the date range of data to be returned"),
|
* @OA\Property(property="date_range", type="string", example="last7", description="The string representation of the date range of data to be returned"),
|
||||||
@ -33,7 +33,7 @@
|
|||||||
* schema="UpdateTaskSchedulerSchema",
|
* schema="UpdateTaskSchedulerSchema",
|
||||||
* type="object",
|
* type="object",
|
||||||
*
|
*
|
||||||
* @OA\Property(property="paused",type="bool",example="false",description="The scheduler paused state"),
|
* @OA\Property(property="paused",type="boolean",example="false",description="The scheduler paused state"),
|
||||||
* * @OA\Property(property="repeat_every",type="string",example="DAY",description="Accepted values (DAY,WEEK,MONTH,3MONTHS,YEAR)"),
|
* * @OA\Property(property="repeat_every",type="string",example="DAY",description="Accepted values (DAY,WEEK,MONTH,3MONTHS,YEAR)"),
|
||||||
* @OA\Property(property="start_from",type="integer",example="1652898504",description="Timestamp when we should start the scheduler, default is today"),
|
* @OA\Property(property="start_from",type="integer",example="1652898504",description="Timestamp when we should start the scheduler, default is today"),
|
||||||
*
|
*
|
||||||
|
@ -63,7 +63,6 @@ class TaskSchedulerController extends BaseController
|
|||||||
|
|
||||||
public function index()
|
public function index()
|
||||||
{
|
{
|
||||||
set_time_limit(45);
|
|
||||||
|
|
||||||
$schedulers = Scheduler::where('company_id', auth()->user()->company()->id);
|
$schedulers = Scheduler::where('company_id', auth()->user()->company()->id);
|
||||||
|
|
||||||
@ -114,13 +113,24 @@ class TaskSchedulerController extends BaseController
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @OA\GET(
|
* @OA\GET(
|
||||||
* path="/api/v1/task_scheduler/{scheduler}",
|
* path="/api/v1/task_scheduler/{id}",
|
||||||
* operationId="showTaskScheduler",
|
* operationId="showTaskScheduler",
|
||||||
* tags={"task_scheduler"},
|
* tags={"task_scheduler"},
|
||||||
* summary="Show given scheduler",
|
* summary="Show given scheduler",
|
||||||
* description="Get scheduler with associated job",
|
* description="Get scheduler with associated job",
|
||||||
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
||||||
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
||||||
|
* @OA\Parameter(
|
||||||
|
* name="id",
|
||||||
|
* in="path",
|
||||||
|
* description="The Scheduler Hashed ID",
|
||||||
|
* example="D2J234DFA",
|
||||||
|
* required=true,
|
||||||
|
* @OA\Schema(
|
||||||
|
* type="string",
|
||||||
|
* format="string",
|
||||||
|
* ),
|
||||||
|
* ),
|
||||||
* @OA\Response(
|
* @OA\Response(
|
||||||
* response=200,
|
* response=200,
|
||||||
* description="success",
|
* description="success",
|
||||||
@ -143,14 +153,24 @@ class TaskSchedulerController extends BaseController
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @OA\PUT(
|
* @OA\PUT(
|
||||||
* path="/api/v1/task_scheduler/{scheduler}",
|
* path="/api/v1/task_scheduler/{id}",
|
||||||
* operationId="updateTaskScheduler",
|
* operationId="updateTaskScheduler",
|
||||||
* tags={"task_scheduler"},
|
* tags={"task_scheduler"},
|
||||||
* summary="Update task scheduler ",
|
* summary="Update task scheduler ",
|
||||||
* description="Update task scheduler",
|
* description="Update task scheduler",
|
||||||
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
||||||
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
||||||
* @OA\RequestBody(
|
* @OA\Parameter(
|
||||||
|
* name="id",
|
||||||
|
* in="path",
|
||||||
|
* description="The Scheduler Hashed ID",
|
||||||
|
* example="D2J234DFA",
|
||||||
|
* required=true,
|
||||||
|
* @OA\Schema(
|
||||||
|
* type="string",
|
||||||
|
* format="string",
|
||||||
|
* ),
|
||||||
|
* ), * @OA\RequestBody(
|
||||||
* required=true,
|
* required=true,
|
||||||
* @OA\JsonContent(ref="#/components/schemas/UpdateTaskSchedulerSchema")
|
* @OA\JsonContent(ref="#/components/schemas/UpdateTaskSchedulerSchema")
|
||||||
* ),
|
* ),
|
||||||
@ -181,13 +201,24 @@ class TaskSchedulerController extends BaseController
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @OA\PUT(
|
* @OA\PUT(
|
||||||
* path="/api/v1/task_scheduler/{scheduler}/update_job/",
|
* path="/api/v1/task_scheduler/{id}/update_job/",
|
||||||
* operationId="updateTaskSchedulerJob",
|
* operationId="updateTaskSchedulerJob",
|
||||||
* tags={"task_scheduler"},
|
* tags={"task_scheduler"},
|
||||||
* summary="Update job for a task scheduler ",
|
* summary="Update job for a task scheduler ",
|
||||||
* description="Update job for a task scheduler | if we are changing action for a job, we should send the request for a new job same as we are creating new scheduler",
|
* description="Update job for a task scheduler | if we are changing action for a job, we should send the request for a new job same as we are creating new scheduler",
|
||||||
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
||||||
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
||||||
|
* @OA\Parameter(
|
||||||
|
* name="id",
|
||||||
|
* in="path",
|
||||||
|
* description="The Scheduler Hashed ID",
|
||||||
|
* example="D2J234DFA",
|
||||||
|
* required=true,
|
||||||
|
* @OA\Schema(
|
||||||
|
* type="string",
|
||||||
|
* format="string",
|
||||||
|
* ),
|
||||||
|
* ),
|
||||||
* @OA\RequestBody(
|
* @OA\RequestBody(
|
||||||
* required=true,
|
* required=true,
|
||||||
* @OA\JsonContent(ref="#/components/schemas/UpdateJobForASchedulerSchema")
|
* @OA\JsonContent(ref="#/components/schemas/UpdateJobForASchedulerSchema")
|
||||||
@ -219,13 +250,24 @@ class TaskSchedulerController extends BaseController
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @OA\DELETE(
|
* @OA\DELETE(
|
||||||
* path="/api/v1/task_scheduler/{scheduler}",
|
* path="/api/v1/task_scheduler/{id}",
|
||||||
* operationId="destroyTaskScheduler",
|
* operationId="destroyTaskScheduler",
|
||||||
* tags={"task_scheduler"},
|
* tags={"task_scheduler"},
|
||||||
* summary="Destroy Task Scheduler",
|
* summary="Destroy Task Scheduler",
|
||||||
* description="Destroy task scheduler and its associated job",
|
* description="Destroy task scheduler and its associated job",
|
||||||
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
* @OA\Parameter(ref="#/components/parameters/X-Api-Secret"),
|
||||||
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
* @OA\Parameter(ref="#/components/parameters/X-Requested-With"),
|
||||||
|
* @OA\Parameter(
|
||||||
|
* name="id",
|
||||||
|
* in="path",
|
||||||
|
* description="The Scheduler Hashed ID",
|
||||||
|
* example="D2J234DFA",
|
||||||
|
* required=true,
|
||||||
|
* @OA\Schema(
|
||||||
|
* type="string",
|
||||||
|
* format="string",
|
||||||
|
* ),
|
||||||
|
* ),
|
||||||
* @OA\Response(
|
* @OA\Response(
|
||||||
* response=200,
|
* response=200,
|
||||||
* description="success",
|
* description="success",
|
||||||
|
@ -47,6 +47,9 @@ class GenericReportRequest extends Request
|
|||||||
if(!array_key_exists('report_keys', $input))
|
if(!array_key_exists('report_keys', $input))
|
||||||
$input['report_keys'] = [];
|
$input['report_keys'] = [];
|
||||||
|
|
||||||
|
if(!array_key_exists('send_email', $input))
|
||||||
|
$input['send_email'] = true;
|
||||||
|
|
||||||
$this->replace($input);
|
$this->replace($input);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,13 +22,6 @@ trait RuntimeFormRequest
|
|||||||
$instance = $validator->getValidatorInstance();
|
$instance = $validator->getValidatorInstance();
|
||||||
|
|
||||||
return $instance;
|
return $instance;
|
||||||
// if ($instance->fails()) {
|
|
||||||
// return $instance->errors();
|
|
||||||
// }
|
|
||||||
|
|
||||||
// $validator->passedValidation();
|
|
||||||
|
|
||||||
// return $validator->all();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -27,4 +27,14 @@ class CreateScheduledTaskRequest extends Request
|
|||||||
'job' => 'required',
|
'job' => 'required',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function prepareForValidation()
|
||||||
|
{
|
||||||
|
$input = $this->all();
|
||||||
|
|
||||||
|
if(!array_key_exists('start_from', $input))
|
||||||
|
$input['start_from'] = now();
|
||||||
|
|
||||||
|
$this->replace($input);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -41,13 +41,13 @@ class UpdateScheduleRequest extends Request
|
|||||||
|
|
||||||
public function prepareForValidation()
|
public function prepareForValidation()
|
||||||
{
|
{
|
||||||
$request = $this->all();
|
$input = $this->all();
|
||||||
|
|
||||||
if (isset($request['start_from'])) {
|
if (isset($input['start_from'])) {
|
||||||
$request['scheduled_run'] = Carbon::parse((int)$request['start_from']);
|
$input['scheduled_run'] = Carbon::parse((int)$input['start_from']);
|
||||||
$request['start_from'] = Carbon::parse((int)$request['start_from']);
|
$input['start_from'] = Carbon::parse((int)$input['start_from']);
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->replace($request);
|
$this->replace($input);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -46,24 +46,38 @@ class TaskScheduler implements ShouldQueue
|
|||||||
*/
|
*/
|
||||||
public function handle()
|
public function handle()
|
||||||
{
|
{
|
||||||
foreach (MultiDB::$dbs as $db) {
|
foreach (MultiDB::$dbs as $db)
|
||||||
|
{
|
||||||
|
|
||||||
MultiDB::setDB($db);
|
MultiDB::setDB($db);
|
||||||
|
|
||||||
$pending_schedulers = $this->fetchJobs();
|
$pending_schedulers = $this->fetchJobs();
|
||||||
foreach ($pending_schedulers as $scheduler) {
|
|
||||||
$this->doJob($scheduler);
|
Scheduler::with('company','job')
|
||||||
}
|
->where('paused', false)
|
||||||
|
->where('is_deleted', false)
|
||||||
|
->where('scheduled_run', '<', now())
|
||||||
|
->cursor()
|
||||||
|
->each(function ($scheduler){
|
||||||
|
|
||||||
|
$this->doJob($scheduler);
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function doJob(Scheduler $scheduler)
|
private function doJob(Scheduler $scheduler)
|
||||||
{
|
{
|
||||||
|
nlog("Doing job {$scheduler->id}");
|
||||||
|
|
||||||
$job = $scheduler->job;
|
$job = $scheduler->job;
|
||||||
|
$company = $scheduler->company;
|
||||||
|
|
||||||
$company = Company::find($job->company_id);
|
if (!$job)
|
||||||
if (!$job || !$company) {
|
|
||||||
return;
|
return;
|
||||||
}
|
|
||||||
$parameters = $job->parameters;
|
$parameters = $job->parameters;
|
||||||
|
|
||||||
|
|
||||||
@ -120,10 +134,7 @@ class TaskScheduler implements ShouldQueue
|
|||||||
|
|
||||||
private function fetchJobs()
|
private function fetchJobs()
|
||||||
{
|
{
|
||||||
return Scheduler::where('paused', false)
|
return ;
|
||||||
->where('is_deleted', false)
|
|
||||||
->whereDate('scheduled_run', '<=', Carbon::now())
|
|
||||||
->cursor();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -48,6 +48,7 @@ class SendToAdmin implements ShouldQueue
|
|||||||
|
|
||||||
public function handle()
|
public function handle()
|
||||||
{
|
{
|
||||||
|
|
||||||
MultiDB::setDb($this->company->db);
|
MultiDB::setDb($this->company->db);
|
||||||
$export = new $this->report_class($this->company, $this->request);
|
$export = new $this->report_class($this->company, $this->request);
|
||||||
$csv = $export->run();
|
$csv = $export->run();
|
||||||
|
@ -70,6 +70,7 @@ class Activity extends StaticModel
|
|||||||
const ARCHIVE_USER = 50;
|
const ARCHIVE_USER = 50;
|
||||||
const DELETE_USER = 51;
|
const DELETE_USER = 51;
|
||||||
const RESTORE_USER = 52;
|
const RESTORE_USER = 52;
|
||||||
|
|
||||||
const MARK_SENT_INVOICE = 53; // not needed?
|
const MARK_SENT_INVOICE = 53; // not needed?
|
||||||
const PAID_INVOICE = 54; //
|
const PAID_INVOICE = 54; //
|
||||||
const EMAIL_INVOICE_FAILED = 57;
|
const EMAIL_INVOICE_FAILED = 57;
|
||||||
@ -138,13 +139,11 @@ class Activity extends StaticModel
|
|||||||
return $this->hasOne(Backup::class);
|
return $this->hasOne(Backup::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public function history()
|
public function history()
|
||||||
{
|
{
|
||||||
return $this->hasOne(Backup::class);
|
return $this->hasOne(Backup::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return mixed
|
* @return mixed
|
||||||
*/
|
*/
|
||||||
@ -177,6 +176,14 @@ class Activity extends StaticModel
|
|||||||
return $this->belongsTo(Invoice::class)->withTrashed();
|
return $this->belongsTo(Invoice::class)->withTrashed();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function recurring_invoice()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(RecurringInvoice::class)->withTrashed();
|
||||||
|
}
|
||||||
|
|
||||||
public function credit()
|
public function credit()
|
||||||
{
|
{
|
||||||
return $this->belongsTo(Credit::class)->withTrashed();
|
return $this->belongsTo(Credit::class)->withTrashed();
|
||||||
@ -198,15 +205,16 @@ class Activity extends StaticModel
|
|||||||
return $this->belongsTo(Payment::class)->withTrashed();
|
return $this->belongsTo(Payment::class)->withTrashed();
|
||||||
}
|
}
|
||||||
|
|
||||||
// public function task()
|
public function expense()
|
||||||
// {
|
{
|
||||||
// return $this->belongsTo(Task::class)->withTrashed();
|
return $this->belongsTo(Expense::class)->withTrashed();
|
||||||
// }
|
}
|
||||||
|
|
||||||
|
public function task()
|
||||||
|
{
|
||||||
|
return $this->belongsTo(Task::class)->withTrashed();
|
||||||
|
}
|
||||||
|
|
||||||
// public function expense()
|
|
||||||
// {
|
|
||||||
// return $this->belongsTo(Expense::class)->withTrashed();
|
|
||||||
// }
|
|
||||||
|
|
||||||
public function company()
|
public function company()
|
||||||
{
|
{
|
||||||
|
@ -37,8 +37,8 @@ class Scheduler extends BaseModel
|
|||||||
'paused',
|
'paused',
|
||||||
'repeat_every',
|
'repeat_every',
|
||||||
'scheduled_run',
|
'scheduled_run',
|
||||||
'company_id'
|
|
||||||
];
|
];
|
||||||
|
|
||||||
protected $casts = [
|
protected $casts = [
|
||||||
'start_from' => 'timestamp',
|
'start_from' => 'timestamp',
|
||||||
'scheduled_run' => 'timestamp',
|
'scheduled_run' => 'timestamp',
|
||||||
|
@ -56,6 +56,7 @@ class TaskSchedulerService
|
|||||||
$scheduler->scheduled_run = $request->get('start_from') ? Carbon::parse((int)$request->get('start_from')) : Carbon::now();;
|
$scheduler->scheduled_run = $request->get('start_from') ? Carbon::parse((int)$request->get('start_from')) : Carbon::now();;
|
||||||
$scheduler->company_id = auth()->user()->company()->id;
|
$scheduler->company_id = auth()->user()->company()->id;
|
||||||
$scheduler->save();
|
$scheduler->save();
|
||||||
|
|
||||||
$this->createJob($request, $scheduler);
|
$this->createJob($request, $scheduler);
|
||||||
|
|
||||||
}
|
}
|
||||||
@ -89,98 +90,100 @@ class TaskSchedulerService
|
|||||||
$rules = (new GenericReportRequest)->rules();
|
$rules = (new GenericReportRequest)->rules();
|
||||||
//custom rules for example here we require date_range but in genericRequest class we don't
|
//custom rules for example here we require date_range but in genericRequest class we don't
|
||||||
$rules['date_range'] = 'string|required';
|
$rules['date_range'] = 'string|required';
|
||||||
$validatedJobData = $request->validate($rules);
|
|
||||||
|
$validator = GenericReportRequest::runFormRequest($request->all());
|
||||||
|
$validatedJobData = $validator->validate();
|
||||||
$job->action_name = ScheduledJob::CREATE_CLIENT_REPORT;
|
$job->action_name = ScheduledJob::CREATE_CLIENT_REPORT;
|
||||||
$job->action_class = $this->getClassPath(ClientExport::class);
|
$job->action_class = $this->getClassPath(ClientExport::class);
|
||||||
$job->parameters = $validatedJobData;
|
$job->parameters = $validatedJobData;
|
||||||
break;
|
break;
|
||||||
case ScheduledJob::CREATE_CLIENT_CONTACT_REPORT:
|
case ScheduledJob::CREATE_CLIENT_CONTACT_REPORT:
|
||||||
$rules = (new GenericReportRequest)->rules();
|
$validator = GenericReportRequest::runFormRequest($request->all());
|
||||||
$validatedJobData = $request->validate($rules);
|
$validatedJobData = $validator->validate();
|
||||||
$job->action_name = ScheduledJob::CREATE_CLIENT_CONTACT_REPORT;
|
$job->action_name = ScheduledJob::CREATE_CLIENT_CONTACT_REPORT;
|
||||||
$job->action_class = $this->getClassPath(ContactExport::class);
|
$job->action_class = $this->getClassPath(ContactExport::class);
|
||||||
$job->parameters = $validatedJobData;
|
$job->parameters = $validatedJobData;
|
||||||
break;
|
break;
|
||||||
case ScheduledJob::CREATE_CREDIT_REPORT:
|
case ScheduledJob::CREATE_CREDIT_REPORT:
|
||||||
$rules = (new GenericReportRequest)->rules();
|
$validator = GenericReportRequest::runFormRequest($request->all());
|
||||||
$validatedJobData = $request->validate($rules);
|
$validatedJobData = $validator->validate();
|
||||||
$job->action_name = ScheduledJob::CREATE_CREDIT_REPORT;
|
$job->action_name = ScheduledJob::CREATE_CREDIT_REPORT;
|
||||||
$job->action_class = $this->getClassPath(CreditExport::class);
|
$job->action_class = $this->getClassPath(CreditExport::class);
|
||||||
$job->parameters = $validatedJobData;
|
$job->parameters = $validatedJobData;
|
||||||
break;
|
break;
|
||||||
case ScheduledJob::CREATE_DOCUMENT_REPORT:
|
case ScheduledJob::CREATE_DOCUMENT_REPORT:
|
||||||
$rules = (new GenericReportRequest)->rules();
|
$validator = GenericReportRequest::runFormRequest($request->all());
|
||||||
$validatedJobData = $request->validate($rules);
|
$validatedJobData = $validator->validate();
|
||||||
$job->action_name = ScheduledJob::CREATE_DOCUMENT_REPORT;
|
$job->action_name = ScheduledJob::CREATE_DOCUMENT_REPORT;
|
||||||
$job->action_class = $this->getClassPath(DocumentExport::class);
|
$job->action_class = $this->getClassPath(DocumentExport::class);
|
||||||
$job->parameters = $validatedJobData;
|
$job->parameters = $validatedJobData;
|
||||||
break;
|
break;
|
||||||
case ScheduledJob::CREATE_EXPENSE_REPORT:
|
case ScheduledJob::CREATE_EXPENSE_REPORT:
|
||||||
$rules = (new GenericReportRequest)->rules();
|
$validator = GenericReportRequest::runFormRequest($request->all());
|
||||||
$validatedJobData = $request->validate($rules);
|
$validatedJobData = $validator->validate();
|
||||||
$job->action_name = ScheduledJob::CREATE_EXPENSE_REPORT;
|
$job->action_name = ScheduledJob::CREATE_EXPENSE_REPORT;
|
||||||
$job->action_class = $this->getClassPath(ExpenseExport::class);
|
$job->action_class = $this->getClassPath(ExpenseExport::class);
|
||||||
$job->parameters = $validatedJobData;
|
$job->parameters = $validatedJobData;
|
||||||
break;
|
break;
|
||||||
case ScheduledJob::CREATE_INVOICE_ITEM_REPORT:
|
case ScheduledJob::CREATE_INVOICE_ITEM_REPORT:
|
||||||
$rules = (new GenericReportRequest)->rules();
|
$validator = GenericReportRequest::runFormRequest($request->all());
|
||||||
$validatedJobData = $request->validate($rules);
|
$validatedJobData = $validator->validate();
|
||||||
$job->action_name = ScheduledJob::CREATE_INVOICE_ITEM_REPORT;
|
$job->action_name = ScheduledJob::CREATE_INVOICE_ITEM_REPORT;
|
||||||
$job->action_class = $this->getClassPath(InvoiceItemExport::class);
|
$job->action_class = $this->getClassPath(InvoiceItemExport::class);
|
||||||
$job->parameters = $validatedJobData;
|
$job->parameters = $validatedJobData;
|
||||||
break;
|
break;
|
||||||
case ScheduledJob::CREATE_INVOICE_REPORT:
|
case ScheduledJob::CREATE_INVOICE_REPORT:
|
||||||
$rules = (new GenericReportRequest)->rules();
|
$validator = GenericReportRequest::runFormRequest($request->all());
|
||||||
$validatedJobData = $request->validate($rules);
|
$validatedJobData = $validator->validate();
|
||||||
$job->action_name = ScheduledJob::CREATE_INVOICE_REPORT;
|
$job->action_name = ScheduledJob::CREATE_INVOICE_REPORT;
|
||||||
$job->action_class = $this->getClassPath(InvoiceExport::class);
|
$job->action_class = $this->getClassPath(InvoiceExport::class);
|
||||||
$job->parameters = $validatedJobData;
|
$job->parameters = $validatedJobData;
|
||||||
break;
|
break;
|
||||||
case ScheduledJob::CREATE_PAYMENT_REPORT:
|
case ScheduledJob::CREATE_PAYMENT_REPORT:
|
||||||
$rules = (new GenericReportRequest)->rules();
|
$validator = GenericReportRequest::runFormRequest($request->all());
|
||||||
$validatedJobData = $request->validate($rules);
|
$validatedJobData = $validator->validate();
|
||||||
$job->action_name = ScheduledJob::CREATE_PAYMENT_REPORT;
|
$job->action_name = ScheduledJob::CREATE_PAYMENT_REPORT;
|
||||||
$job->action_class = $this->getClassPath(PaymentExport::class);
|
$job->action_class = $this->getClassPath(PaymentExport::class);
|
||||||
$job->parameters = $validatedJobData;
|
$job->parameters = $validatedJobData;
|
||||||
break;
|
break;
|
||||||
case ScheduledJob::CREATE_PRODUCT_REPORT:
|
case ScheduledJob::CREATE_PRODUCT_REPORT:
|
||||||
$rules = (new GenericReportRequest)->rules();
|
$validator = GenericReportRequest::runFormRequest($request->all());
|
||||||
$validatedJobData = $request->validate($rules);
|
$validatedJobData = $validator->validate();
|
||||||
$job->action_name = ScheduledJob::CREATE_PRODUCT_REPORT;
|
$job->action_name = ScheduledJob::CREATE_PRODUCT_REPORT;
|
||||||
$job->action_class = $this->getClassPath(ProductExport::class);
|
$job->action_class = $this->getClassPath(ProductExport::class);
|
||||||
$job->parameters = $validatedJobData;
|
$job->parameters = $validatedJobData;
|
||||||
break;
|
break;
|
||||||
case ScheduledJob::CREATE_PROFIT_AND_LOSS_REPORT:
|
case ScheduledJob::CREATE_PROFIT_AND_LOSS_REPORT:
|
||||||
$rules = (new ProfitLossRequest())->rules();
|
$validator = GenericReportRequest::runFormRequest($request->all());
|
||||||
$validatedJobData = $request->validate($rules);
|
$validatedJobData = $validator->validate();
|
||||||
$job->action_name = ScheduledJob::CREATE_PROFIT_AND_LOSS_REPORT;
|
$job->action_name = ScheduledJob::CREATE_PROFIT_AND_LOSS_REPORT;
|
||||||
$job->action_class = $this->getClassPath(ProfitAndLoss::class);
|
$job->action_class = $this->getClassPath(ProfitAndLoss::class);
|
||||||
$job->parameters = $validatedJobData;
|
$job->parameters = $validatedJobData;
|
||||||
break;
|
break;
|
||||||
case ScheduledJob::CREATE_QUOTE_ITEM_REPORT:
|
case ScheduledJob::CREATE_QUOTE_ITEM_REPORT:
|
||||||
$rules = (new GenericReportRequest)->rules();
|
$validator = GenericReportRequest::runFormRequest($request->all());
|
||||||
$validatedJobData = $request->validate($rules);
|
$validatedJobData = $validator->validate();
|
||||||
$job->action_name = ScheduledJob::CREATE_QUOTE_ITEM_REPORT;
|
$job->action_name = ScheduledJob::CREATE_QUOTE_ITEM_REPORT;
|
||||||
$job->action_class = $this->getClassPath(QuoteItemExport::class);
|
$job->action_class = $this->getClassPath(QuoteItemExport::class);
|
||||||
$job->parameters = $validatedJobData;
|
$job->parameters = $validatedJobData;
|
||||||
break;
|
break;
|
||||||
case ScheduledJob::CREATE_QUOTE_REPORT:
|
case ScheduledJob::CREATE_QUOTE_REPORT:
|
||||||
$rules = (new GenericReportRequest)->rules();
|
$validator = GenericReportRequest::runFormRequest($request->all());
|
||||||
$validatedJobData = $request->validate($rules);
|
$validatedJobData = $validator->validate();
|
||||||
$job->action_name = ScheduledJob::CREATE_QUOTE_REPORT;
|
$job->action_name = ScheduledJob::CREATE_QUOTE_REPORT;
|
||||||
$job->action_class = $this->getClassPath(QuoteExport::class);
|
$job->action_class = $this->getClassPath(QuoteExport::class);
|
||||||
$job->parameters = $validatedJobData;
|
$job->parameters = $validatedJobData;
|
||||||
break;
|
break;
|
||||||
case ScheduledJob::CREATE_RECURRING_INVOICE_REPORT:
|
case ScheduledJob::CREATE_RECURRING_INVOICE_REPORT:
|
||||||
$rules = (new GenericReportRequest)->rules();
|
$validator = GenericReportRequest::runFormRequest($request->all());
|
||||||
$validatedJobData = $request->validate($rules);
|
$validatedJobData = $validator->validate();
|
||||||
$job->action_name = ScheduledJob::CREATE_RECURRING_INVOICE_REPORT;
|
$job->action_name = ScheduledJob::CREATE_RECURRING_INVOICE_REPORT;
|
||||||
$job->action_class = $this->getClassPath(RecurringInvoiceExport::class);
|
$job->action_class = $this->getClassPath(RecurringInvoiceExport::class);
|
||||||
$job->parameters = $validatedJobData;
|
$job->parameters = $validatedJobData;
|
||||||
break;
|
break;
|
||||||
case ScheduledJob::CREATE_TASK_REPORT:
|
case ScheduledJob::CREATE_TASK_REPORT:
|
||||||
$rules = (new GenericReportRequest)->rules();
|
$validator = GenericReportRequest::runFormRequest($request->all());
|
||||||
$validatedJobData = $request->validate($rules);
|
$validatedJobData = $validator->validate();
|
||||||
$job->action_name = ScheduledJob::CREATE_TASK_REPORT;
|
$job->action_name = ScheduledJob::CREATE_TASK_REPORT;
|
||||||
$job->action_class = $this->getClassPath(TaskExport::class);
|
$job->action_class = $this->getClassPath(TaskExport::class);
|
||||||
$job->parameters = $validatedJobData;
|
$job->parameters = $validatedJobData;
|
||||||
|
@ -13,6 +13,10 @@ namespace App\Transformers;
|
|||||||
|
|
||||||
use App\Models\Activity;
|
use App\Models\Activity;
|
||||||
use App\Models\Backup;
|
use App\Models\Backup;
|
||||||
|
use App\Models\ClientContact;
|
||||||
|
use App\Models\Invoice;
|
||||||
|
use App\Models\Task;
|
||||||
|
use App\Models\User;
|
||||||
use App\Utils\Traits\MakesHash;
|
use App\Utils\Traits\MakesHash;
|
||||||
|
|
||||||
class ActivityTransformer extends EntityTransformer
|
class ActivityTransformer extends EntityTransformer
|
||||||
@ -25,7 +29,17 @@ class ActivityTransformer extends EntityTransformer
|
|||||||
* @var array
|
* @var array
|
||||||
*/
|
*/
|
||||||
protected $availableIncludes = [
|
protected $availableIncludes = [
|
||||||
'history'
|
'history',
|
||||||
|
'user',
|
||||||
|
'client',
|
||||||
|
'contact',
|
||||||
|
'recurring_invoice',
|
||||||
|
'invoice',
|
||||||
|
'credit',
|
||||||
|
'quote',
|
||||||
|
'payment',
|
||||||
|
'expense',
|
||||||
|
'task',
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -66,4 +80,75 @@ class ActivityTransformer extends EntityTransformer
|
|||||||
|
|
||||||
return $this->includeItem($activity->backup, $transformer, Backup::class);
|
return $this->includeItem($activity->backup, $transformer, Backup::class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function includeClient(Activity $activity)
|
||||||
|
{
|
||||||
|
$transformer = new ClientTransformer($this->serializer);
|
||||||
|
|
||||||
|
return $this->includeItem($activity->client, $transformer, Client::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function includeContact(Activity $activity)
|
||||||
|
{
|
||||||
|
$transformer = new ClientContactTransformer($this->serializer);
|
||||||
|
|
||||||
|
return $this->includeItem($activity->contact, $transformer, ClientContact::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function includeRecurringInvoice(Activity $activity)
|
||||||
|
{
|
||||||
|
$transformer = new RecurringInvoiceTransformer($this->serializer);
|
||||||
|
|
||||||
|
return $this->includeItem($activity->recurring_invoice, $transformer, RecurringInvoice::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function includeQuote(Activity $activity)
|
||||||
|
{
|
||||||
|
$transformer = new RecurringInvoiceTransformer($this->serializer);
|
||||||
|
|
||||||
|
return $this->includeItem($activity->quote, $transformer, Quote::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function includeInvoice(Activity $activity)
|
||||||
|
{
|
||||||
|
$transformer = new InvoiceTransformer($this->serializer);
|
||||||
|
|
||||||
|
return $this->includeItem($activity->invoice, $transformer, Invoice::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function includeCredit(Activity $activity)
|
||||||
|
{
|
||||||
|
$transformer = new CreditTransformer($this->serializer);
|
||||||
|
|
||||||
|
return $this->includeItem($activity->credit, $transformer, Credit::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function includePayment(Activity $activity)
|
||||||
|
{
|
||||||
|
$transformer = new PaymentTransformer($this->serializer);
|
||||||
|
|
||||||
|
return $this->includeItem($activity->payment, $transformer, Payment::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function includeUser(Activity $activity)
|
||||||
|
{
|
||||||
|
$transformer = new UserTransformer($this->serializer);
|
||||||
|
|
||||||
|
return $this->includeItem($activity->user, $transformer, User::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function includeExpense(Activity $activity)
|
||||||
|
{
|
||||||
|
$transformer = new ExpenseTransformer($this->serializer);
|
||||||
|
|
||||||
|
return $this->includeItem($activity->expense, $transformer, Expense::class);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function includeTask(Activity $activity)
|
||||||
|
{
|
||||||
|
$transformer = new TaskTransformer($this->serializer);
|
||||||
|
|
||||||
|
return $this->includeItem($activity->task, $transformer, Task::class);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,7 @@ class TaskSchedulerTransformer extends EntityTransformer
|
|||||||
{
|
{
|
||||||
return [
|
return [
|
||||||
'id' => $this->encodePrimaryKey($scheduler->id),
|
'id' => $this->encodePrimaryKey($scheduler->id),
|
||||||
|
'is_deleted' => (bool)$scheduler->is_deleted,
|
||||||
'paused' => (bool)$scheduler->paused,
|
'paused' => (bool)$scheduler->paused,
|
||||||
'repeat_every' => (string)$scheduler->repeat_every,
|
'repeat_every' => (string)$scheduler->repeat_every,
|
||||||
'start_from' => (int)$scheduler->start_from,
|
'start_from' => (int)$scheduler->start_from,
|
||||||
|
@ -187,7 +187,7 @@ return [
|
|||||||
'ninja_apple_api_key' => env('APPLE_API_KEY', false),
|
'ninja_apple_api_key' => env('APPLE_API_KEY', false),
|
||||||
'ninja_apple_private_key' => env('APPLE_PRIVATE_KEY', false),
|
'ninja_apple_private_key' => env('APPLE_PRIVATE_KEY', false),
|
||||||
'ninja_apple_bundle_id' => env('APPLE_BUNDLE_ID', false),
|
'ninja_apple_bundle_id' => env('APPLE_BUNDLE_ID', false),
|
||||||
'ninja_apple_issuer_id' => env('APPLE_ISSUER_ID', false)
|
'ninja_apple_issuer_id' => env('APPLE_ISSUER_ID', false),
|
||||||
|
'react_app_enabled' => env('REACT_APP_ENABLED', false),
|
||||||
];
|
];
|
||||||
|
|
||||||
|
@ -794,12 +794,12 @@ $LANG = array(
|
|||||||
'activity_45' => ':user deleted task :task',
|
'activity_45' => ':user deleted task :task',
|
||||||
'activity_46' => ':user restored task :task',
|
'activity_46' => ':user restored task :task',
|
||||||
'activity_47' => ':user updated expense :expense',
|
'activity_47' => ':user updated expense :expense',
|
||||||
'activity_48' => ':user updated ticket :ticket',
|
'activity_48' => ':user created user :user',
|
||||||
'activity_49' => ':user closed ticket :ticket',
|
'activity_49' => ':user updated user :user',
|
||||||
'activity_50' => ':user merged ticket :ticket',
|
'activity_50' => ':user archived user :user',
|
||||||
'activity_51' => ':user split ticket :ticket',
|
'activity_51' => ':user deleted user :user',
|
||||||
'activity_52' => ':contact opened ticket :ticket',
|
'activity_52' => ':user restored user :user',
|
||||||
'activity_53' => ':contact reopened ticket :ticket',
|
'activity_53' => ':user marked sent :invoice',
|
||||||
'activity_54' => ':user reopened ticket :ticket',
|
'activity_54' => ':user reopened ticket :ticket',
|
||||||
'activity_55' => ':contact replied ticket :ticket',
|
'activity_55' => ':contact replied ticket :ticket',
|
||||||
'activity_56' => ':user viewed ticket :ticket',
|
'activity_56' => ':user viewed ticket :ticket',
|
||||||
@ -4583,8 +4583,30 @@ $LANG = array(
|
|||||||
'alternate_pdf_viewer' => 'Alternate PDF Viewer',
|
'alternate_pdf_viewer' => 'Alternate PDF Viewer',
|
||||||
'alternate_pdf_viewer_help' => 'Improve scrolling over the PDF preview [BETA]',
|
'alternate_pdf_viewer_help' => 'Improve scrolling over the PDF preview [BETA]',
|
||||||
'currency_cayman_island_dollar' => 'Cayman Island Dollar',
|
'currency_cayman_island_dollar' => 'Cayman Island Dollar',
|
||||||
'download_report_description' => 'Please see attached file to check your report.'
|
'download_report_description' => 'Please see attached file to check your report.',
|
||||||
|
'left' => 'Left',
|
||||||
|
'right' => 'Right',
|
||||||
|
'center' => 'Center',
|
||||||
|
'page_numbering' => 'Page Numbering',
|
||||||
|
'page_numbering_alignment' => 'Page Numbering Alignment',
|
||||||
|
'invoice_sent_notification_label' => 'Invoice Sent',
|
||||||
|
'show_product_description' => 'Show Product Description',
|
||||||
|
'show_product_description_help' => 'Include the description in the product dropdown',
|
||||||
|
'invoice_items' => 'Invoice Items',
|
||||||
|
'quote_items' => 'Quote Items',
|
||||||
|
'profitloss' => 'Profit and Loss',
|
||||||
|
'import_format' => 'Import Format',
|
||||||
|
'export_format' => 'Export Format',
|
||||||
|
'export_type' => 'Export Type',
|
||||||
|
'stop_on_unpaid' => 'Stop On Unpaid',
|
||||||
|
'stop_on_unpaid_help' => 'Stop creating recurring invoices if the last invoice is unpaid.',
|
||||||
|
'use_quote_terms' => 'Use Quote Terms',
|
||||||
|
'use_quote_terms_help' => 'When converting a quote to an invoice',
|
||||||
|
'add_country' => 'Add Country',
|
||||||
|
'enable_tooltips' => 'Enable Tooltips',
|
||||||
|
'enable_tooltips_help' => 'Show tooltips when hovering the mouse',
|
||||||
|
'multiple_client_error' => 'Error: records belong to more than one client',
|
||||||
|
'login_label' => 'Login to an existing account',
|
||||||
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
207
resources/views/react/head.blade.php
Normal file
207
resources/views/react/head.blade.php
Normal file
@ -0,0 +1,207 @@
|
|||||||
|
<link rel="modulepreload" href="/react/nth-check.58e8385d.js">
|
||||||
|
<link rel="stylesheet" href="/react/index.bff791ad.css">
|
||||||
|
<link rel="modulepreload" href="/react/uuid.ef4f150d.js">
|
||||||
|
<link rel="modulepreload" href="/react/@emotion.9aa0086d.js">
|
||||||
|
<link rel="modulepreload" href="/react/react-select.0c11d83f.js">
|
||||||
|
<link rel="modulepreload" href="/react/space-separated-tokens.59bb4ca8.js">
|
||||||
|
<link rel="modulepreload" href="/react/raf-schd.43184c40.js">
|
||||||
|
<link rel="modulepreload" href="/react/recharts-scale.dc8389ce.js">
|
||||||
|
<link rel="modulepreload" href="/react/unist-util-position.04d68b2b.js">
|
||||||
|
<link rel="modulepreload" href="/react/reduce-css-calc.281532ee.js">
|
||||||
|
<link rel="modulepreload" href="/react/is-plain-obj.260ab441.js">
|
||||||
|
<link rel="modulepreload" href="/react/remark-rehype.66f21be3.js">
|
||||||
|
<link rel="modulepreload" href="/react/extend.ca41ef84.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-extension-gfm-footnote.5e766f8c.js">
|
||||||
|
<link rel="modulepreload" href="/react/boolbase.bd705bc9.js">
|
||||||
|
<link rel="modulepreload" href="/react/react.967f52d5.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-factory-whitespace.4e8e9fce.js">
|
||||||
|
<link rel="modulepreload" href="/react/react-router-dom.09ff5a14.js">
|
||||||
|
<script type="module" crossorigin src="/react/index.a4e53c8d.js"></script>
|
||||||
|
<link rel="modulepreload" href="/react/mdast-util-to-string.717718d5.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-util-html-tag-name.8b7c83fe.js">
|
||||||
|
<link rel="modulepreload" href="/react/mdast-util-gfm-autolink-literal.4b04cd2e.js">
|
||||||
|
<link rel="stylesheet" href="/react/@uiw.d17b7851.css">
|
||||||
|
<link rel="modulepreload" href="/react/unist-util-is.bd39e4f2.js">
|
||||||
|
<link rel="modulepreload" href="/react/react-qr-code.4878cb6b.js">
|
||||||
|
<link rel="modulepreload" href="/react/web-namespaces.a24d7a09.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-util-sanitize-uri.f9c714eb.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-extension-gfm-task-list-item.33d9f10c.js">
|
||||||
|
<link rel="modulepreload" href="/react/html-parse-stringify.32417b46.js">
|
||||||
|
<link rel="modulepreload" href="/react/i18next.cf61342d.js">
|
||||||
|
<link rel="modulepreload" href="/react/html-escaper.7cd36ce3.js">
|
||||||
|
<link rel="modulepreload" href="/react/lodash-es.8df7cfb3.js">
|
||||||
|
<link rel="modulepreload" href="/react/d3-shape.c407f78b.js">
|
||||||
|
<link rel="modulepreload" href="/react/tslib.1cf50020.js">
|
||||||
|
<link rel="modulepreload" href="/react/use-memo-one.4a0d5bdc.js">
|
||||||
|
<link rel="modulepreload" href="/react/qr.js.da7c6dcd.js">
|
||||||
|
<link rel="modulepreload" href="/react/mdast-util-gfm.0152e39c.js">
|
||||||
|
<link rel="modulepreload" href="/react/is-decimal.247a88b7.js">
|
||||||
|
<link rel="modulepreload" href="/react/react-hot-toast.80758c68.js">
|
||||||
|
<link rel="modulepreload" href="/react/react-popper.d301c4dd.js">
|
||||||
|
<link rel="modulepreload" href="/react/react-debounce-input.1347744c.js">
|
||||||
|
<link rel="modulepreload" href="/react/d3-format.5a3f6ba7.js">
|
||||||
|
<link rel="modulepreload" href="/react/react-markdown.3a061863.js">
|
||||||
|
<link rel="modulepreload" href="/react/rehype-rewrite.cb5dac09.js">
|
||||||
|
<link rel="modulepreload" href="/react/attr-accept.6d6aa28d.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-extension-gfm.3af3365b.js">
|
||||||
|
<link rel="modulepreload" href="/react/@popperjs.50883750.js">
|
||||||
|
<link rel="modulepreload" href="/react/warning.3e618ed9.js">
|
||||||
|
<link rel="modulepreload" href="/react/immer.a08a4913.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-util-encode.b78670b5.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-util-character.811e4fc8.js">
|
||||||
|
<link rel="modulepreload" href="/react/property-information.17621e99.js">
|
||||||
|
<link rel="modulepreload" href="/react/formik.0c2f9d9e.js">
|
||||||
|
<link rel="modulepreload" href="/react/character-reference-invalid.9429e209.js">
|
||||||
|
<link rel="modulepreload" href="/react/hast-util-to-parse5.d0422f4e.js">
|
||||||
|
<link rel="modulepreload" href="/react/prop-types.c5f1cd8f.js">
|
||||||
|
<link rel="modulepreload" href="/react/currency.js.cd0659e5.js">
|
||||||
|
<link rel="modulepreload" href="/react/redux.acdf7418.js">
|
||||||
|
<link rel="modulepreload" href="/react/react-feather.ba7315c7.js">
|
||||||
|
<link rel="modulepreload" href="/react/decode-named-character-reference.58fdd984.js">
|
||||||
|
<link rel="modulepreload" href="/react/raf.ef427214.js">
|
||||||
|
<link rel="modulepreload" href="/react/react-redux.7269b315.js">
|
||||||
|
<link rel="modulepreload" href="/react/ccount.24f4fb2a.js">
|
||||||
|
<link rel="modulepreload" href="/react/react-resize-detector.73849032.js">
|
||||||
|
<link rel="modulepreload" href="/react/hast-util-heading-rank.0127330c.js">
|
||||||
|
<link rel="modulepreload" href="/react/character-entities-html4.bfdecac8.js">
|
||||||
|
<link rel="modulepreload" href="/react/unist-util-visit.551af7f6.js">
|
||||||
|
<link rel="modulepreload" href="/react/is-alphabetical.a64573e0.js">
|
||||||
|
<link rel="modulepreload" href="/react/prismjs.1fc2e6a8.js">
|
||||||
|
<link rel="modulepreload" href="/react/comma-separated-tokens.826a3e44.js">
|
||||||
|
<link rel="modulepreload" href="/react/react-dropzone.87de0271.js">
|
||||||
|
<link rel="modulepreload" href="/react/parse-entities.0d3eeb8f.js">
|
||||||
|
<link rel="modulepreload" href="/react/unist-util-stringify-position.6cdff1ba.js">
|
||||||
|
<link rel="modulepreload" href="/react/hast-util-from-parse5.1bc31bb6.js">
|
||||||
|
<link rel="modulepreload" href="/react/lodash.debounce.bf978eb6.js">
|
||||||
|
<link rel="modulepreload" href="/react/rehype-prism-plus.2cab531a.js">
|
||||||
|
<link rel="modulepreload" href="/react/react-onclickoutside.05557887.js">
|
||||||
|
<link rel="modulepreload" href="/react/hast-util-select.9295ace7.js">
|
||||||
|
<link rel="modulepreload" href="/react/zwitch.84c833f3.js">
|
||||||
|
<link rel="modulepreload" href="/react/css-unit-converter.d617fa75.js">
|
||||||
|
<link rel="modulepreload" href="/react/rehype-autolink-headings.4312e6cb.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-extension-gfm-autolink-literal.75d97f6e.js">
|
||||||
|
<link rel="modulepreload" href="/react/vfile.8a59bc59.js">
|
||||||
|
<link rel="modulepreload" href="/react/hoist-non-react-statics.cc69b77f.js">
|
||||||
|
<link rel="modulepreload" href="/react/collect.js.64c89be2.js">
|
||||||
|
<link rel="modulepreload" href="/react/react-beautiful-dnd.1242ed17.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-extension-gfm-tagfilter.97dd1d78.js">
|
||||||
|
<link rel="modulepreload" href="/react/react-dom.bbdc7aed.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-core-commonmark.894384bd.js">
|
||||||
|
<link rel="modulepreload" href="/react/mdast-util-gfm-footnote.9832ece2.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-util-normalize-identifier.f045ed13.js">
|
||||||
|
<link rel="modulepreload" href="/react/array-move.20870289.js">
|
||||||
|
<link rel="modulepreload" href="/react/lodash.6e1b81d9.js">
|
||||||
|
<link rel="modulepreload" href="/react/date-fns.c9928d0b.js">
|
||||||
|
<link rel="modulepreload" href="/react/mdast-util-from-markdown.b6500a0a.js">
|
||||||
|
<link rel="modulepreload" href="/react/eventemitter3.e831f4a3.js">
|
||||||
|
<link rel="modulepreload" href="/react/is-alphanumerical.39e15300.js">
|
||||||
|
<link rel="modulepreload" href="/react/hastscript.aa96013f.js">
|
||||||
|
<link rel="modulepreload" href="/react/unist-util-generated.22d80e74.js">
|
||||||
|
<link rel="modulepreload" href="/react/remark-gfm.f031f689.js">
|
||||||
|
<link rel="modulepreload" href="/react/remark-parse.a34fb5cc.js">
|
||||||
|
<link rel="modulepreload" href="/react/axios.308741bb.js">
|
||||||
|
<link rel="modulepreload" href="/react/character-entities-legacy.cb27298c.js">
|
||||||
|
<link rel="modulepreload" href="/react/parse5.761ebfb8.js">
|
||||||
|
<link rel="modulepreload" href="/react/void-elements.fa8a9e47.js">
|
||||||
|
<link rel="modulepreload" href="/react/scheduler.84e669cb.js">
|
||||||
|
<link rel="modulepreload" href="/react/markdown-table.f01db7c9.js">
|
||||||
|
<link rel="modulepreload" href="/react/mdast-util-gfm-strikethrough.4389f7f3.js">
|
||||||
|
<link rel="stylesheet" href="/react/react-datepicker.e2be669b.css">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-factory-label.2e0fc916.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-extension-gfm-strikethrough.39c8bc63.js">
|
||||||
|
<link rel="modulepreload" href="/react/vfile-message.9560db1f.js">
|
||||||
|
<link rel="modulepreload" href="/react/mdast-util-to-markdown.7e1348ca.js">
|
||||||
|
<link rel="modulepreload" href="/react/redux-thunk.281dc3fb.js">
|
||||||
|
<link rel="modulepreload" href="/react/is-buffer.f91fab60.js">
|
||||||
|
<link rel="modulepreload" href="/react/rehype-raw.4c3d8b62.js">
|
||||||
|
<link rel="modulepreload" href="/react/d3-array.1895b022.js">
|
||||||
|
<link rel="modulepreload" href="/react/parse-numeric-range.fd682744.js">
|
||||||
|
<link rel="modulepreload" href="/react/hast-util-parse-selector.1be1f27a.js">
|
||||||
|
<link rel="modulepreload" href="/react/refractor.9012dc30.js">
|
||||||
|
<link rel="modulepreload" href="/react/css-box-model.54a3012b.js">
|
||||||
|
<link rel="modulepreload" href="/react/tiny-invariant.817bfd36.js">
|
||||||
|
<link rel="modulepreload" href="/react/object-assign.f7ed182d.js">
|
||||||
|
<link rel="modulepreload" href="/react/reselect.68dc670d.js">
|
||||||
|
<link rel="modulepreload" href="/react/rehype-slug.8f0b0db8.js">
|
||||||
|
<link rel="modulepreload" href="/react/resize-observer-polyfill.2e10476d.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-factory-title.f4e107a2.js">
|
||||||
|
<link rel="modulepreload" href="/react/mdast-util-gfm-table.f1729384.js">
|
||||||
|
<link rel="modulepreload" href="/react/react-query.15f431cf.js">
|
||||||
|
<link rel="modulepreload" href="/react/react-i18next.b628690b.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-factory-destination.08e32d90.js">
|
||||||
|
<link rel="modulepreload" href="/react/d3-scale.40adf854.js">
|
||||||
|
<link rel="modulepreload" href="/react/hast-util-to-string.03a4649a.js">
|
||||||
|
<link rel="modulepreload" href="/react/d3-path.a0f08300.js">
|
||||||
|
<link rel="modulepreload" href="/react/hast-util-whitespace.b9acc724.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-util-classify-character.bb02743f.js">
|
||||||
|
<link rel="modulepreload" href="/react/@babel.d4f90752.js">
|
||||||
|
<link rel="modulepreload" href="/react/performance-now.3ab08c2f.js">
|
||||||
|
<link rel="modulepreload" href="/react/d3-time.03d82efa.js">
|
||||||
|
<link rel="modulepreload" href="/react/react-smooth.ec2093ff.js">
|
||||||
|
<link rel="modulepreload" href="/react/stringify-entities.a3ae839a.js">
|
||||||
|
<link rel="modulepreload" href="/react/@sentry.c26c3197.js">
|
||||||
|
<link rel="modulepreload" href="/react/react-lifecycles-compat.8d6bbd76.js">
|
||||||
|
<link rel="modulepreload" href="/react/html-void-elements.d3b5aea3.js">
|
||||||
|
<link rel="modulepreload" href="/react/rehype-parse.74f2042d.js">
|
||||||
|
<link rel="modulepreload" href="/react/d3-color.69ee14e3.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-util-subtokenize.0273ad72.js">
|
||||||
|
<link rel="modulepreload" href="/react/react-router.47f931a4.js">
|
||||||
|
<link rel="modulepreload" href="/react/deepmerge.a6dda5ef.js">
|
||||||
|
<link rel="modulepreload" href="/react/file-selector.6172b388.js">
|
||||||
|
<link rel="modulepreload" href="/react/mdast-util-gfm-task-list-item.36dc3006.js">
|
||||||
|
<link rel="modulepreload" href="/react/hast-to-hyperscript.55881f10.js">
|
||||||
|
<link rel="modulepreload" href="/react/react-fast-compare.d5a5a050.js">
|
||||||
|
<link rel="modulepreload" href="/react/fast-equals.9df4a03b.js">
|
||||||
|
<link rel="modulepreload" href="/react/tippy.js.1053d821.js">
|
||||||
|
<link rel="modulepreload" href="/react/@headlessui.f2f54a45.js">
|
||||||
|
<link rel="modulepreload" href="/react/bail.58fa4042.js">
|
||||||
|
<link rel="modulepreload" href="/react/vfile-location.85c89654.js">
|
||||||
|
<link rel="modulepreload" href="/react/recharts.38803f97.js">
|
||||||
|
<link rel="modulepreload" href="/react/unist-util-filter.14ea3396.js">
|
||||||
|
<link rel="modulepreload" href="/react/direction.5373b893.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark.31ec2ae2.js">
|
||||||
|
<link rel="modulepreload" href="/react/goober.56221fd8.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-util-decode-string.d48b94e2.js">
|
||||||
|
<link rel="modulepreload" href="/react/react-datepicker.3e071b73.js">
|
||||||
|
<link rel="modulepreload" href="/react/hast-util-is-element.4ae8c712.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-util-chunked.62b98efd.js">
|
||||||
|
<link rel="modulepreload" href="/react/mdurl.530e10e1.js">
|
||||||
|
<link rel="modulepreload" href="/react/mdast-util-find-and-replace.c8360cfe.js">
|
||||||
|
<link rel="modulepreload" href="/react/internmap.bf78dfdb.js">
|
||||||
|
<link rel="modulepreload" href="/react/tiny-warning.14328f40.js">
|
||||||
|
<link rel="modulepreload" href="/react/css-selector-parser.838f527e.js">
|
||||||
|
<link rel="modulepreload" href="/react/decimal.js-light.b1218db1.js">
|
||||||
|
<link rel="modulepreload" href="/react/hast-util-has-property.bf6e0cae.js">
|
||||||
|
<link rel="modulepreload" href="/react/unified.ac4b28d0.js">
|
||||||
|
<link rel="modulepreload" href="/react/@uiw.e53102d7.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-util-combine-extensions.fc6008e7.js">
|
||||||
|
<link rel="modulepreload" href="/react/d3-time-format.0353a6ed.js">
|
||||||
|
<link rel="modulepreload" href="/react/style-to-object.74a4cfe6.js">
|
||||||
|
<link rel="modulepreload" href="/react/hast-util-raw.6bdb4dc9.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-util-resolve-all.b4e652e2.js">
|
||||||
|
<link rel="modulepreload" href="/react/bcp-47-match.b7ba7942.js">
|
||||||
|
<link rel="modulepreload" href="/react/stylis.ba53937c.js">
|
||||||
|
<link rel="modulepreload" href="/react/mdast-util-definitions.fd07577f.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-util-decode-numeric-character-reference.029edbd3.js">
|
||||||
|
<link rel="modulepreload" href="/react/unist-builder.67dd3ae6.js">
|
||||||
|
<link rel="modulepreload" href="/react/memoize-one.413f527d.js">
|
||||||
|
<link rel="modulepreload" href="/react/hast-util-to-html.54b58e35.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-extension-gfm-table.f7983341.js">
|
||||||
|
<link rel="modulepreload" href="/react/unist-util-visit-parents.78083329.js">
|
||||||
|
<link rel="modulepreload" href="/react/github-slugger.144f2824.js">
|
||||||
|
<link rel="modulepreload" href="/react/dayjs.6e560245.js">
|
||||||
|
<link rel="modulepreload" href="/react/rehype.bee4df94.js">
|
||||||
|
<link rel="modulepreload" href="/react/history.8119d98b.js">
|
||||||
|
<link rel="modulepreload" href="/react/inline-style-parser.ec55a77b.js">
|
||||||
|
<link rel="modulepreload" href="/react/is-hexadecimal.d91cb013.js">
|
||||||
|
<link rel="modulepreload" href="/react/react-is.c6bf3c04.js">
|
||||||
|
<link rel="modulepreload" href="/react/rehype-attr.8040248d.js">
|
||||||
|
<link rel="modulepreload" href="/react/pretty-bytes.1ef697de.js">
|
||||||
|
<link rel="modulepreload" href="/react/micromark-factory-space.84551a41.js">
|
||||||
|
<link rel="modulepreload" href="/react/rehype-stringify.540b84fb.js">
|
||||||
|
<link rel="modulepreload" href="/react/d3-interpolate.f5146873.js">
|
||||||
|
<link rel="modulepreload" href="/react/mdast-util-to-hast.d1d8e0b2.js">
|
||||||
|
<link rel="modulepreload" href="/react/trough.714478ec.js">
|
||||||
|
<link rel="modulepreload" href="/react/@tippyjs.36ad76fa.js">
|
||||||
|
<link rel="modulepreload" href="/react/@reduxjs.9b745b7e.js">
|
||||||
|
<link rel="modulepreload" href="/react/classnames.02e8c2fa.js">
|
20
resources/views/react/index.blade.php
Normal file
20
resources/views/react/index.blade.php
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html data-report-errors="{{ $report_errors }}" data-rc="{{ $rc }}" data-user-agent="{{ $user_agent }}" data-login="{{ $login }}">
|
||||||
|
<head>
|
||||||
|
<!-- Source: https://github.com/invoiceninja/invoiceninja -->
|
||||||
|
<!-- Version: {{ config('ninja.app_version') }} -->
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>{{ config('ninja.app_name') }}</title>
|
||||||
|
<meta name="google-signin-client_id" content="{{ config('services.google.client_id') }}">
|
||||||
|
|
||||||
|
@include('react.head')
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="h-full">
|
||||||
|
<noscript>You need to enable JavaScript to run this app.</noscript>
|
||||||
|
<div id="root"></div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
@ -15,6 +15,7 @@ use Illuminate\Routing\Middleware\ThrottleRequests;
|
|||||||
use Illuminate\Support\Facades\Session;
|
use Illuminate\Support\Facades\Session;
|
||||||
use Tests\MockUnitData;
|
use Tests\MockUnitData;
|
||||||
use Tests\TestCase;
|
use Tests\TestCase;
|
||||||
|
use Illuminate\Validation\ValidationException;
|
||||||
|
|
||||||
class SchedulerTest extends TestCase
|
class SchedulerTest extends TestCase
|
||||||
{
|
{
|
||||||
@ -35,10 +36,12 @@ class SchedulerTest extends TestCase
|
|||||||
|
|
||||||
$this->makeTestData();
|
$this->makeTestData();
|
||||||
|
|
||||||
|
|
||||||
$this->withoutMiddleware(
|
$this->withoutMiddleware(
|
||||||
ThrottleRequests::class
|
ThrottleRequests::class
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// $this->withoutExceptionHandling();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function testSchedulerCantBeCreatedWithWrongData()
|
public function testSchedulerCantBeCreatedWithWrongData()
|
||||||
@ -48,13 +51,23 @@ class SchedulerTest extends TestCase
|
|||||||
'job' => ScheduledJob::CREATE_CLIENT_REPORT,
|
'job' => ScheduledJob::CREATE_CLIENT_REPORT,
|
||||||
'date_key' => '123',
|
'date_key' => '123',
|
||||||
'report_keys' => ['test'],
|
'report_keys' => ['test'],
|
||||||
// 'date_range' => 'all',
|
'date_range' => 'all',
|
||||||
|
// 'start_from' => '2022-01-01'
|
||||||
];
|
];
|
||||||
|
|
||||||
|
$response = false;
|
||||||
|
|
||||||
|
// try {
|
||||||
$response = $this->withHeaders([
|
$response = $this->withHeaders([
|
||||||
'X-API-SECRET' => config('ninja.api_secret'),
|
'X-API-SECRET' => config('ninja.api_secret'),
|
||||||
'X-API-TOKEN' => $this->token,
|
'X-API-TOKEN' => $this->token,
|
||||||
])->post('/api/v1/task_scheduler/', $data);
|
])->post('/api/v1/task_scheduler/', $data);
|
||||||
|
// } catch (ValidationException $e) {
|
||||||
|
// $message = json_decode($e->validator->getMessageBag(), 1);
|
||||||
|
// nlog($message);
|
||||||
|
// }
|
||||||
|
// $response->assertStatus(200);
|
||||||
|
|
||||||
|
|
||||||
$response->assertSessionHasErrors();
|
$response->assertSessionHasErrors();
|
||||||
|
|
||||||
@ -62,10 +75,14 @@ class SchedulerTest extends TestCase
|
|||||||
|
|
||||||
public function testSchedulerCanBeUpdated()
|
public function testSchedulerCanBeUpdated()
|
||||||
{
|
{
|
||||||
$this->createScheduler();
|
$response = $this->createScheduler();
|
||||||
|
|
||||||
|
nlog($response);
|
||||||
|
$arr = $response->json();
|
||||||
|
$id = $arr['data']['id'];
|
||||||
|
|
||||||
|
$scheduler = Scheduler::find($this->decodePrimaryKey($id));
|
||||||
|
|
||||||
$scheduler = Scheduler::first();
|
|
||||||
$updateData = [
|
$updateData = [
|
||||||
'start_from' => 1655934741
|
'start_from' => 1655934741
|
||||||
];
|
];
|
||||||
@ -80,10 +97,12 @@ class SchedulerTest extends TestCase
|
|||||||
|
|
||||||
public function testSchedulerCanBeSeen()
|
public function testSchedulerCanBeSeen()
|
||||||
{
|
{
|
||||||
$this->createScheduler();
|
$response = $this->createScheduler();
|
||||||
|
|
||||||
|
$arr = $response->json();
|
||||||
|
$id = $arr['data']['id'];
|
||||||
|
|
||||||
$scheduler = Scheduler::first();
|
$scheduler = Scheduler::find($this->decodePrimaryKey($id));
|
||||||
|
|
||||||
$response = $this->withHeaders([
|
$response = $this->withHeaders([
|
||||||
'X-API-SECRET' => config('ninja.api_secret'),
|
'X-API-SECRET' => config('ninja.api_secret'),
|
||||||
@ -98,9 +117,13 @@ class SchedulerTest extends TestCase
|
|||||||
|
|
||||||
public function testSchedulerCanBeDeleted()
|
public function testSchedulerCanBeDeleted()
|
||||||
{
|
{
|
||||||
$this->createScheduler();
|
$response = $this->createScheduler();
|
||||||
|
|
||||||
|
$arr = $response->json();
|
||||||
|
$id = $arr['data']['id'];
|
||||||
|
|
||||||
|
$scheduler = Scheduler::find($this->decodePrimaryKey($id));
|
||||||
|
|
||||||
$scheduler = Scheduler::first();
|
|
||||||
$response = $this->withHeaders([
|
$response = $this->withHeaders([
|
||||||
'X-API-SECRET' => config('ninja.api_secret'),
|
'X-API-SECRET' => config('ninja.api_secret'),
|
||||||
'X-API-TOKEN' => $this->token,
|
'X-API-TOKEN' => $this->token,
|
||||||
@ -112,9 +135,13 @@ class SchedulerTest extends TestCase
|
|||||||
|
|
||||||
public function testSchedulerJobCanBeUpdated()
|
public function testSchedulerJobCanBeUpdated()
|
||||||
{
|
{
|
||||||
$this->createScheduler();
|
$response = $this->createScheduler();
|
||||||
|
|
||||||
|
$arr = $response->json();
|
||||||
|
$id = $arr['data']['id'];
|
||||||
|
|
||||||
|
$scheduler = Scheduler::find($this->decodePrimaryKey($id));
|
||||||
|
|
||||||
$scheduler = Scheduler::first();
|
|
||||||
$this->assertSame('create_client_report', $scheduler->job->action_name);
|
$this->assertSame('create_client_report', $scheduler->job->action_name);
|
||||||
|
|
||||||
$updateData = [
|
$updateData = [
|
||||||
@ -130,6 +157,7 @@ class SchedulerTest extends TestCase
|
|||||||
|
|
||||||
$updatedSchedulerJob = Scheduler::first()->job->action_name;
|
$updatedSchedulerJob = Scheduler::first()->job->action_name;
|
||||||
$arr = $response->json();
|
$arr = $response->json();
|
||||||
|
|
||||||
$this->assertSame('create_credit_report', $arr['data']['job']['action_name']);
|
$this->assertSame('create_credit_report', $arr['data']['job']['action_name']);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,6 +165,11 @@ class SchedulerTest extends TestCase
|
|||||||
{
|
{
|
||||||
$response = $this->createScheduler();
|
$response = $this->createScheduler();
|
||||||
|
|
||||||
|
$arr = $response->json();
|
||||||
|
$id = $arr['data']['id'];
|
||||||
|
|
||||||
|
$scheduler = Scheduler::find($this->decodePrimaryKey($id));
|
||||||
|
|
||||||
$all_schedulers = Scheduler::count();
|
$all_schedulers = Scheduler::count();
|
||||||
|
|
||||||
$this->assertSame(1, $all_schedulers);
|
$this->assertSame(1, $all_schedulers);
|
||||||
@ -153,6 +186,7 @@ class SchedulerTest extends TestCase
|
|||||||
'date_key' => '123',
|
'date_key' => '123',
|
||||||
'report_keys' => ['test'],
|
'report_keys' => ['test'],
|
||||||
'date_range' => 'all',
|
'date_range' => 'all',
|
||||||
|
'start_from' => '2022-01-01'
|
||||||
];
|
];
|
||||||
|
|
||||||
return $response = $this->withHeaders([
|
return $response = $this->withHeaders([
|
||||||
|
Loading…
x
Reference in New Issue
Block a user