Akaunting/app/Abstracts/BulkAction.php

329 lines
8.8 KiB
PHP
Raw Normal View History

2019-11-16 07:21:14 +00:00
<?php
namespace App\Abstracts;
2024-07-10 14:09:53 +00:00
use App\Jobs\Common\CreateMediableForDownload;
use App\Jobs\Common\CreateZipForDownload;
2019-12-23 09:46:00 +00:00
use App\Jobs\Common\DeleteContact;
use App\Jobs\Common\UpdateContact;
use App\Jobs\Banking\DeleteTransaction;
2019-12-22 12:58:48 +00:00
use App\Traits\Jobs;
use App\Traits\Relationships;
2023-10-03 08:06:08 +00:00
use App\Traits\Translations;
2021-05-23 14:13:13 +00:00
use App\Utilities\Export;
use App\Utilities\Import;
2021-06-27 19:08:02 +00:00
use Illuminate\Support\Arr;
2024-07-10 14:09:53 +00:00
use Illuminate\Support\Facades\Bus;
use Throwable;
2019-11-16 07:21:14 +00:00
2019-11-18 18:51:19 +00:00
abstract class BulkAction
2019-11-16 07:21:14 +00:00
{
2023-10-03 08:06:08 +00:00
use Jobs, Relationships, Translations;
2019-12-22 12:58:48 +00:00
2019-11-16 07:21:14 +00:00
public $model = false;
public $actions = [
2022-06-01 07:15:55 +00:00
'enable' => [
'name' => 'general.enable',
'message' => 'bulk_actions.message.enable',
'permission' => 'update-common-items',
2019-11-16 07:21:14 +00:00
],
2022-06-01 07:15:55 +00:00
'disable' => [
'name' => 'general.disable',
'message' => 'bulk_actions.message.disable',
'permission' => 'update-common-items',
2019-12-23 09:46:00 +00:00
],
2022-06-01 07:15:55 +00:00
'delete' => [
'name' => 'general.delete',
'message' => 'bulk_actions.message.delete',
'permission' => 'delete-common-items',
2019-11-16 07:21:14 +00:00
],
2022-06-01 07:15:55 +00:00
'export' => [
'name' => 'general.export',
'message' => 'bulk_actions.message.export',
'type' => 'download'
2019-11-16 07:21:14 +00:00
],
2024-07-10 14:09:53 +00:00
'download' => [
'name' => 'general.download',
'message' => 'bulk_actions.message.download',
'type' => 'download',
],
2019-11-16 07:21:14 +00:00
];
2022-06-01 07:15:55 +00:00
public $icons = [
'enable' => 'check_circle',
'disable' => 'hide_source',
'delete' => 'delete',
2022-09-19 14:01:09 +00:00
'duplicate' => 'file_copy',
2022-06-01 07:15:55 +00:00
'export' => 'file_download',
2024-07-11 10:43:16 +00:00
'download' => 'download',
2022-06-01 07:15:55 +00:00
'reconcile' => 'published_with_changes',
'unreconcile' => 'layers_clear',
'received' => 'call_received',
'cancelled' => 'cancel',
'sent' => 'send',
'approved' => 'approval',
'refused' => 'do_not_disturb_on',
'issued' => 'mark_email_read',
'confirmed' => 'thumb_up_alt',
];
public $messages = [
'general' => 'bulk_actions.success.general',
'enable' => 'messages.success.enabled',
'disable' => 'messages.success.disabled',
'delete' => 'messages.success.deleted',
'duplicate' => 'messages.success.duplicated',
'invite' => 'messages.success.invited',
'end' => 'messages.success.ended',
];
2021-06-27 19:08:02 +00:00
public function getSelectedRecords($request, $relationships = null)
2019-12-23 09:46:00 +00:00
{
2021-06-27 19:08:02 +00:00
if (empty($relationships)) {
$model = $this->model::query();
} else {
$relationships = Arr::wrap($relationships);
$model = $this->model::with($relationships);
}
return $model->find($this->getSelectedInput($request));
2019-12-23 09:46:00 +00:00
}
public function getSelectedInput($request)
{
return $request->get('selected', []);
}
2023-10-03 08:06:08 +00:00
public function getUpdateRequest($request)
{
foreach ($request->all() as $key => $value) {
if (empty($value)) {
unset($request[$key]);
}
}
return $request;
}
/**
* Generate a response based on request type like HTML, JSON, or anything else.
*
* @param string $view
* @param array $data
*
* @return \Illuminate\Http\Response
*/
public function response($view, $data = [])
{
$method = request()->get('handle', 'edit');
$handle = $this->actions[$method]['handle'] ?? 'update';
$url = route('bulk-actions.action', $this->path);
$html = view('components.index.bulkaction.modal', [
'url' => $url,
'handle' => $handle,
'selected' => $data['selected'] ?? $this->getSelectedInput(request()),
'html' => view($view, $data)->render(),
])->render();
return response()->json([
'success' => true,
'error' => false,
'message' => '',
'data' => [
'title' => $this->findTranslation($this->text),
'path' => $url,
'handle' => $handle,
],
'html' => $html,
]);
}
2019-11-16 07:21:14 +00:00
/**
* Duplicate the specified resource.
*
* @param $request
*
* @return Response
*/
public function duplicate($request)
{
2019-12-23 09:46:00 +00:00
$items = $this->getSelectedRecords($request);
2019-11-16 07:21:14 +00:00
foreach ($items as $item) {
$item->duplicate();
}
}
/**
* Enable the specified resource.
*
* @param $request
*
* @return Response
*/
public function enable($request)
{
2019-12-23 09:46:00 +00:00
$items = $this->getSelectedRecords($request);
2019-11-16 07:21:14 +00:00
foreach ($items as $item) {
2020-11-13 12:37:46 +00:00
$item->enabled = true;
2019-11-16 07:21:14 +00:00
$item->save();
}
}
/**
* Disable the specified resource.
*
* @param $request
*
* @return Response
*/
public function disable($request)
{
2019-12-23 09:46:00 +00:00
$items = $this->getSelectedRecords($request);
2019-11-16 07:21:14 +00:00
foreach ($items as $item) {
2020-11-13 12:37:46 +00:00
$item->enabled = false;
2019-11-16 07:21:14 +00:00
$item->save();
}
}
/**
* Remove the specified resource from storage.
*
* @param $request
*
* @return Response
*/
public function delete($request)
{
$this->destroy($request);
}
/**
* Remove the specified resource from storage.
*
* @param $request
*
* @return Response
*/
public function destroy($request)
{
2019-12-23 09:46:00 +00:00
$items = $this->getSelectedRecords($request);
2019-11-16 07:21:14 +00:00
foreach ($items as $item) {
$item->delete();
}
}
2019-12-23 09:46:00 +00:00
public function disableContacts($request)
{
2021-06-27 19:08:02 +00:00
$contacts = $this->getSelectedRecords($request, 'user');
2019-12-23 09:46:00 +00:00
foreach ($contacts as $contact) {
try {
$this->dispatch(new UpdateContact($contact, request()->merge(['enabled' => 0])));
} catch (\Exception $e) {
flash($e->getMessage())->error()->important();
2019-12-23 09:46:00 +00:00
}
}
}
public function deleteContacts($request)
{
2021-06-27 19:08:02 +00:00
$contacts = $this->getSelectedRecords($request, 'user');
2019-12-23 09:46:00 +00:00
foreach ($contacts as $contact) {
try {
$this->dispatch(new DeleteContact($contact));
} catch (\Exception $e) {
flash($e->getMessage())->error()->important();
2019-12-23 09:46:00 +00:00
}
}
}
public function deleteTransactions($request)
{
2021-06-27 19:08:02 +00:00
$transactions = $this->getSelectedRecords($request, 'category');
2019-12-23 09:46:00 +00:00
foreach ($transactions as $transaction) {
try {
$this->dispatch(new DeleteTransaction($transaction));
} catch (\Exception $e) {
flash($e->getMessage())->error()->important();
2019-12-23 09:46:00 +00:00
}
}
}
2021-05-23 14:13:13 +00:00
/**
* Import the excel file or catch errors
*
* @param $class
* @param $request
* @param $translation
*
* @return array
*/
public function importExcel($class, $request, $translation)
{
return Import::fromExcel($class, $request, $translation);
}
/**
* Export the excel file or catch errors
*
* @param $class
* @param $translation
* @param $extension
*
* @return mixed
*/
public function exportExcel($class, $translation, $extension = 'xlsx')
{
return Export::toExcel($class, $translation, $extension);
}
2024-07-10 14:09:53 +00:00
/**
* Download the pdf file or catch errors
*
* @param $class
* @param $file_name
* @param $translation
*
* @return mixed
*/
public function downloadPdf($selected, $class, $file_name, $translation)
{
try {
if (should_queue()) {
$batch[] = new CreateZipForDownload($selected, $class, $file_name);
$batch[] = new CreateMediableForDownload(user(), $file_name, $translation);
2025-03-27 08:06:07 +00:00
Bus::chain($batch)->onQueue('jobs')->dispatch();
2024-07-10 14:09:53 +00:00
$message = trans('messages.success.download_queued', ['type' => $translation]);
flash($message)->success();
return back();
} else {
$this->dispatch(new CreateZipForDownload($selected, $class, $file_name));
2025-03-27 08:06:07 +00:00
$folder_path = 'app' . DIRECTORY_SEPARATOR . 'temp' . DIRECTORY_SEPARATOR . company_id() . DIRECTORY_SEPARATOR . 'bulk_actions' . DIRECTORY_SEPARATOR;
2024-07-10 14:09:53 +00:00
return response()->download(get_storage_path($folder_path . $file_name . '.zip'))->deleteFileAfterSend(true);
}
} catch (Throwable $e) {
report($e);
flash($e->getMessage())->error()->important();
return back();
}
}
2019-11-16 07:21:14 +00:00
}