Merge branch 'v5-develop' of https://github.com/turbo124/invoiceninja into v5-develop

This commit is contained in:
David Bomba 2023-11-18 18:59:33 +11:00
commit bc1ba0f237
15 changed files with 217 additions and 99 deletions

View File

@ -11,36 +11,37 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Events\Client\ClientWasCreated; use App\Utils\Ninja;
use App\Events\Client\ClientWasUpdated;
use App\Factory\ClientFactory;
use App\Filters\ClientFilters;
use App\Http\Requests\Client\BulkClientRequest;
use App\Http\Requests\Client\CreateClientRequest;
use App\Http\Requests\Client\DestroyClientRequest;
use App\Http\Requests\Client\EditClientRequest;
use App\Http\Requests\Client\PurgeClientRequest;
use App\Http\Requests\Client\ReactivateClientEmailRequest;
use App\Http\Requests\Client\ShowClientRequest;
use App\Http\Requests\Client\StoreClientRequest;
use App\Http\Requests\Client\UpdateClientRequest;
use App\Http\Requests\Client\UploadClientRequest;
use App\Jobs\Client\UpdateTaxData;
use App\Jobs\PostMark\ProcessPostmarkWebhook;
use App\Models\Account;
use App\Models\Client; use App\Models\Client;
use App\Models\Account;
use App\Models\Company; use App\Models\Company;
use App\Models\SystemLog; use App\Models\SystemLog;
use App\Repositories\ClientRepository;
use App\Transformers\ClientTransformer;
use App\Utils\Ninja;
use App\Utils\Traits\BulkOptions;
use App\Utils\Traits\MakesHash;
use App\Utils\Traits\SavesDocuments;
use App\Utils\Traits\Uploadable;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Storage;
use Postmark\PostmarkClient; use Postmark\PostmarkClient;
use Illuminate\Http\Response;
use App\Factory\ClientFactory;
use App\Filters\ClientFilters;
use App\Utils\Traits\MakesHash;
use App\Utils\Traits\Uploadable;
use App\Utils\Traits\BulkOptions;
use App\Jobs\Client\UpdateTaxData;
use App\Utils\Traits\SavesDocuments;
use App\Repositories\ClientRepository;
use App\Events\Client\ClientWasCreated;
use App\Events\Client\ClientWasUpdated;
use App\Transformers\ClientTransformer;
use Illuminate\Support\Facades\Storage;
use App\Services\Template\TemplateAction;
use App\Jobs\PostMark\ProcessPostmarkWebhook;
use App\Http\Requests\Client\BulkClientRequest;
use App\Http\Requests\Client\EditClientRequest;
use App\Http\Requests\Client\ShowClientRequest;
use App\Http\Requests\Client\PurgeClientRequest;
use App\Http\Requests\Client\StoreClientRequest;
use App\Http\Requests\Client\CreateClientRequest;
use App\Http\Requests\Client\UpdateClientRequest;
use App\Http\Requests\Client\UploadClientRequest;
use App\Http\Requests\Client\DestroyClientRequest;
use App\Http\Requests\Client\ReactivateClientEmailRequest;
/** /**
* Class ClientController. * Class ClientController.
@ -217,12 +218,31 @@ class ClientController extends BaseController
$clients = Client::withTrashed() $clients = Client::withTrashed()
->company() ->company()
->whereIn('id', $request->ids) ->whereIn('id', $request->ids)
->cursor() ->get();
->each(function ($client) use ($action, $user) {
if ($user->can('edit', $client)) { if($action == 'template' && $user->can('view', $clients->first())) {
$this->client_repo->{$action}($client);
} $hash_or_response = $request->boolean('send_email') ? 'email sent' : \Illuminate\Support\Str::uuid();
});
TemplateAction::dispatch(
$clients->pluck('id')->toArray(),
$request->template_id,
Client::class,
$user->id,
$user->company(),
$user->company()->db,
$hash_or_response,
$request->boolean('send_email')
);
return response()->json(['message' => $hash_or_response], 200);
}
$clients->each(function ($client) use ($action, $user) {
if ($user->can('edit', $client)) {
$this->client_repo->{$action}($client);
}
});
return $this->listResponse(Client::query()->withTrashed()->company()->whereIn('id', $request->ids)); return $this->listResponse(Client::query()->withTrashed()->company()->whereIn('id', $request->ids));
} }

View File

@ -557,7 +557,7 @@ class CreditController extends BaseController
$hash_or_response = $request->boolean('send_email') ? 'email sent' : \Illuminate\Support\Str::uuid(); $hash_or_response = $request->boolean('send_email') ? 'email sent' : \Illuminate\Support\Str::uuid();
TemplateAction::dispatch( TemplateAction::dispatch(
$credits->pluck('id')->toArray(), $credits->pluck('hashed_id')->toArray(),
$request->template_id, $request->template_id,
Credit::class, Credit::class,
$user->id, $user->id,
@ -570,8 +570,6 @@ class CreditController extends BaseController
return response()->json(['message' => $hash_or_response], 200); return response()->json(['message' => $hash_or_response], 200);
} }
$credits->each(function ($credit, $key) use ($action, $user) { $credits->each(function ($credit, $key) use ($action, $user) {
if ($user->can('edit', $credit)) { if ($user->can('edit', $credit)) {
$this->performAction($credit, $action, true); $this->performAction($credit, $action, true);

View File

@ -519,11 +519,11 @@ class PaymentController extends BaseController
if($action == 'template' && $user->can('view', $payments->first())) { if($action == 'template' && $user->can('view', $payments->first())) {
$hash_or_response = request()->boolean('send_email') ? 'email sent' : \Illuminate\Support\Str::uuid(); $hash_or_response = request()->boolean('send_email') ? 'email sent' : \Illuminate\Support\Str::uuid();
nlog($payments->pluck('hashed_id')->toArray());
TemplateAction::dispatch( TemplateAction::dispatch(
$payments->pluck('id')->toArray(), $payments->pluck('hashed_id')->toArray(),
$request->template_id, $request->template_id,
PurchaseOrder::class, Payment::class,
$user->id, $user->id,
$user->company(), $user->company(),
$user->company()->db, $user->company()->db,

View File

@ -11,23 +11,25 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\Account;
use App\Models\Project;
use Illuminate\Http\Response;
use App\Factory\ProjectFactory; use App\Factory\ProjectFactory;
use App\Filters\ProjectFilters; use App\Filters\ProjectFilters;
use App\Http\Requests\Project\CreateProjectRequest; use App\Utils\Traits\MakesHash;
use App\Http\Requests\Project\DestroyProjectRequest; use App\Utils\Traits\SavesDocuments;
use App\Utils\Traits\GeneratesCounter;
use App\Repositories\ProjectRepository;
use App\Transformers\ProjectTransformer;
use App\Services\Template\TemplateAction;
use App\Http\Requests\Project\EditProjectRequest; use App\Http\Requests\Project\EditProjectRequest;
use App\Http\Requests\Project\ShowProjectRequest; use App\Http\Requests\Project\ShowProjectRequest;
use App\Http\Requests\Project\StoreProjectRequest; use App\Http\Requests\Project\StoreProjectRequest;
use App\Http\Requests\Project\CreateProjectRequest;
use App\Http\Requests\Project\UpdateProjectRequest; use App\Http\Requests\Project\UpdateProjectRequest;
use App\Http\Requests\Project\UploadProjectRequest; use App\Http\Requests\Project\UploadProjectRequest;
use App\Models\Account; use App\Http\Requests\Project\DestroyProjectRequest;
use App\Models\Project; use App\Http\Requests\Project\BulkProjectRequest;
use App\Repositories\ProjectRepository;
use App\Transformers\ProjectTransformer;
use App\Utils\Traits\GeneratesCounter;
use App\Utils\Traits\MakesHash;
use App\Utils\Traits\SavesDocuments;
use Illuminate\Http\Response;
/** /**
* Class ProjectController. * Class ProjectController.
@ -490,18 +492,36 @@ class ProjectController extends BaseController
* ), * ),
* ) * )
*/ */
public function bulk() public function bulk(BulkProjectRequest $request)
{ {
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
$action = request()->input('action'); $action = $request->input('action');
$ids = request()->input('ids'); $ids = $request->input('ids');
$projects = Project::withTrashed()->find($this->transformKeys($ids)); $projects = Project::withTrashed()->whereIn('id', $this->transformKeys($ids))->company()->get();
$projects->each(function ($project, $key) use ($action, $user) { if($action == 'template' && $user->can('view', $projects->first())) {
$hash_or_response = $request->boolean('send_email') ? 'email sent' : \Illuminate\Support\Str::uuid();
TemplateAction::dispatch(
$projects->pluck('hashed_id')->toArray(),
$request->template_id,
Project::class,
$user->id,
$user->company(),
$user->company()->db,
$hash_or_response,
$request->boolean('send_email')
);
return response()->json(['message' => $hash_or_response], 200);
}
$projects->each(function ($project) use ($action, $user) {
if ($user->can('edit', $project)) { if ($user->can('edit', $project)) {
$this->project_repo->{$action}($project); $this->project_repo->{$action}($project);
} }

View File

@ -525,15 +525,12 @@ class PurchaseOrderController extends BaseController
}, 'print.pdf', ['Content-Type' => 'application/pdf']); }, 'print.pdf', ['Content-Type' => 'application/pdf']);
} }
if($action == 'template' && $user->can('view', $purchase_orders->first())) { if($action == 'template' && $user->can('view', $purchase_orders->first())) {
$hash_or_response = $request->boolean('send_email') ? 'email sent' : \Illuminate\Support\Str::uuid(); $hash_or_response = $request->boolean('send_email') ? 'email sent' : \Illuminate\Support\Str::uuid();
TemplateAction::dispatch( TemplateAction::dispatch(
$purchase_orders->pluck('id')->toArray(), $purchase_orders->pluck('hashed_id')->toArray(),
$request->template_id, $request->template_id,
PurchaseOrder::class, PurchaseOrder::class,
$user->id, $user->id,
@ -546,7 +543,6 @@ class PurchaseOrderController extends BaseController
return response()->json(['message' => $hash_or_response], 200); return response()->json(['message' => $hash_or_response], 200);
} }
/* /*
* Send the other actions to the switch * Send the other actions to the switch
*/ */

View File

@ -518,9 +518,9 @@ class QuoteController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
$action = request()->input('action'); $action = $request->input('action');
$ids = request()->input('ids'); $ids = $request->input('ids');
if (Ninja::isHosted() && (stripos($action, 'email') !== false) && !$user->account->account_sms_verified) { if (Ninja::isHosted() && (stripos($action, 'email') !== false) && !$user->account->account_sms_verified) {
return response(['message' => 'Please verify your account to send emails.'], 400); return response(['message' => 'Please verify your account to send emails.'], 400);

View File

@ -11,29 +11,31 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Events\Task\TaskWasCreated; use App\Models\Task;
use App\Events\Task\TaskWasUpdated; use App\Utils\Ninja;
use App\Models\Account;
use App\Models\TaskStatus;
use App\Factory\TaskFactory; use App\Factory\TaskFactory;
use App\Filters\TaskFilters; use App\Filters\TaskFilters;
use App\Http\Requests\Task\CreateTaskRequest; use Illuminate\Http\Response;
use App\Http\Requests\Task\DestroyTaskRequest; use App\Utils\Traits\MakesHash;
use App\Utils\Traits\Uploadable;
use App\Utils\Traits\BulkOptions;
use App\Events\Task\TaskWasCreated;
use App\Events\Task\TaskWasUpdated;
use App\Repositories\TaskRepository;
use App\Utils\Traits\SavesDocuments;
use App\Transformers\TaskTransformer;
use App\Services\Template\TemplateAction;
use App\Http\Requests\Task\BulkTaskRequest;
use App\Http\Requests\Task\EditTaskRequest; use App\Http\Requests\Task\EditTaskRequest;
use App\Http\Requests\Task\ShowTaskRequest; use App\Http\Requests\Task\ShowTaskRequest;
use App\Http\Requests\Task\SortTaskRequest; use App\Http\Requests\Task\SortTaskRequest;
use App\Http\Requests\Task\StoreTaskRequest; use App\Http\Requests\Task\StoreTaskRequest;
use App\Http\Requests\Task\CreateTaskRequest;
use App\Http\Requests\Task\UpdateTaskRequest; use App\Http\Requests\Task\UpdateTaskRequest;
use App\Http\Requests\Task\UploadTaskRequest; use App\Http\Requests\Task\UploadTaskRequest;
use App\Models\Account; use App\Http\Requests\Task\DestroyTaskRequest;
use App\Models\Task;
use App\Models\TaskStatus;
use App\Repositories\TaskRepository;
use App\Transformers\TaskTransformer;
use App\Utils\Ninja;
use App\Utils\Traits\BulkOptions;
use App\Utils\Traits\MakesHash;
use App\Utils\Traits\SavesDocuments;
use App\Utils\Traits\Uploadable;
use Illuminate\Http\Response;
/** /**
* Class TaskController. * Class TaskController.
@ -497,16 +499,36 @@ class TaskController extends BaseController
* ), * ),
* ) * )
*/ */
public function bulk() public function bulk(BulkTaskRequest $request)
{ {
$action = request()->input('action'); /** @var \App\Models\User $user */
$user = auth()->user();
$ids = request()->input('ids'); $action = $request->input('action');
$tasks = Task::withTrashed()->find($this->transformKeys($ids));
$tasks->each(function ($task, $key) use ($action) { $ids = $request->input('ids');
/** @var \App\Models\User $user */
$user = auth()->user(); $tasks = Task::withTrashed()->whereIn('id', $this->transformKeys($ids))->company()->get();
if($action == 'template' && $user->can('view', $tasks->first())) {
$hash_or_response = request()->boolean('send_email') ? 'email sent' : \Illuminate\Support\Str::uuid();
TemplateAction::dispatch(
$tasks->pluck('hashed_id')->toArray(),
$request->template_id,
Task::class,
$user->id,
$user->company(),
$user->company()->db,
$hash_or_response,
$request->boolean('send_email')
);
return response()->json(['message' => $hash_or_response], 200);
}
$tasks->each(function ($task, $key) use ($action, $user) {
if ($user->can('edit', $task)) { if ($user->can('edit', $task)) {
$this->task_repo->{$action}($task); $this->task_repo->{$action}($task);
} }

View File

@ -35,9 +35,13 @@ class BulkClientRequest extends Request
$user = auth()->user(); $user = auth()->user();
return [ return [
'action' => 'required|string|in:archive,restore,delete,template',
'ids' => ['required','bail','array',Rule::exists('clients', 'id')->where('company_id', $user->company()->id)], 'ids' => ['required','bail','array',Rule::exists('clients', 'id')->where('company_id', $user->company()->id)],
'action' => 'in:archive,restore,delete' 'template' => 'sometimes|string',
'template_id' => 'sometimes|string',
'send_email' => 'sometimes|bool'
]; ];
} }
public function prepareForValidation() public function prepareForValidation()

View File

@ -35,9 +35,15 @@ class BulkCreditRequest extends FormRequest
*/ */
public function rules() public function rules()
{ {
/** @var \App\Models\User $user */
$user = auth()->user();
return [ return [
'ids' => ['required','bail','array',Rule::exists('credits', 'id')->where('company_id', auth()->user()->company()->id)], 'ids' => ['required','bail','array',Rule::exists('credits', 'id')->where('company_id', $user->company()->id)],
'action' => 'required|bail|in:archive,restore,delete,email,bulk_download,bulk_print,mark_paid,clone_to_credit,history,mark_sent,download,send_email' 'action' => 'required|bail|in:archive,restore,delete,email,bulk_download,bulk_print,mark_paid,clone_to_credit,history,mark_sent,download,send_email,template',
'template' => 'sometimes|string',
'template_id' => 'sometimes|string',
'send_email' => 'sometimes|bool'
]; ];
} }

View File

@ -0,0 +1,45 @@
<?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\Http\Requests\Project;
use App\Http\Requests\Request;
class BulkProjectRequest extends Request
{
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize()
{
return true;
}
/**
* Get the validation rules that apply to the request.
*
* @return array
*/
public function rules()
{
return [
'action' => 'required|string',
'ids' => 'required|array',
'template' => 'sometimes|string',
'template_id' => 'sometimes|string',
'send_email' => 'sometimes|bool'
];
}
}

View File

@ -30,7 +30,10 @@ class BulkPurchaseOrderRequest extends Request
{ {
return [ return [
'ids' => 'required|bail|array|min:1', 'ids' => 'required|bail|array|min:1',
'action' => 'in:archive,restore,delete,email,bulk_download,bulk_print,mark_sent,download,send_email,add_to_inventory,expense,cancel' 'action' => 'in:template,archive,restore,delete,email,bulk_download,bulk_print,mark_sent,download,send_email,add_to_inventory,expense,cancel',
'template' => 'sometimes|string',
'template_id' => 'sometimes|string',
'send_email' => 'sometimes|bool'
]; ];
} }
} }

View File

@ -31,7 +31,11 @@ class BulkActionQuoteRequest extends Request
$input = $this->all(); $input = $this->all();
$rules = [ $rules = [
'action' => 'sometimes|in:convert_to_invoice,convert_to_project,email,bulk_download,bulk_print,clone_to_invoice,approve,download,restore,archive,delete,send_email,mark_sent', 'action' => 'sometimes|in:template,convert_to_invoice,convert_to_project,email,bulk_download,bulk_print,clone_to_invoice,approve,download,restore,archive,delete,send_email,mark_sent',
'ids' => 'required|array',
'template' => 'sometimes|string',
'template_id' => 'sometimes|string',
'send_email' => 'sometimes|bool'
]; ];
if (in_array($input['action'], ['convert,convert_to_invoice'])) { if (in_array($input['action'], ['convert,convert_to_invoice'])) {

View File

@ -12,12 +12,9 @@
namespace App\Http\Requests\Task; namespace App\Http\Requests\Task;
use App\Http\Requests\Request; use App\Http\Requests\Request;
use App\Models\Task;
use App\Utils\Traits\BulkOptions;
class BulkTaskRequest extends Request class BulkTaskRequest extends Request
{ {
use BulkOptions;
/** /**
* Determine if the user is authorized to make this request. * Determine if the user is authorized to make this request.
@ -26,7 +23,7 @@ class BulkTaskRequest extends Request
*/ */
public function authorize() public function authorize()
{ {
return auth()->user()->can(auth()->user()->isAdmin(), Task::class); return true;
} }
/** /**
@ -36,13 +33,14 @@ class BulkTaskRequest extends Request
*/ */
public function rules() public function rules()
{ {
$rules = $this->getGlobalRules();
return [
'action' => 'required|string',
'ids' => 'required|array',
'template' => 'sometimes|string',
'template_id' => 'sometimes|string',
'send_email' => 'sometimes|bool'
];
/* We don't require IDs on bulk storing. */
if ($this->action !== self::$STORE_METHOD) {
$rules['ids'] = ['required'];
}
return $rules;
} }
} }

View File

@ -103,6 +103,8 @@ class TemplateAction implements ShouldQueue
->where('company_id', $this->company->id) ->where('company_id', $this->company->id)
->get(); ->get();
nlog($result->toArray());
if($result->count() <= 1) { if($result->count() <= 1) {
$data[$key] = collect($result); $data[$key] = collect($result);
} else { } else {

View File

@ -120,7 +120,7 @@ class TemplateService
* @return self * @return self
*/ */
public function build(array $data): self public function build(array $data): self
{ {nlog($data);
$this->compose() $this->compose()
->processData($data) ->processData($data)
->parseNinjaBlocks() ->parseNinjaBlocks()