refactored bulk actions

This commit is contained in:
denisdulici 2019-12-23 12:46:00 +03:00
parent d4efb90251
commit a3dc7b8bb7
20 changed files with 342 additions and 681 deletions

View File

@ -2,6 +2,9 @@
namespace App\Abstracts; namespace App\Abstracts;
use App\Jobs\Common\DeleteContact;
use App\Jobs\Common\UpdateContact;
use App\Jobs\Banking\DeleteTransaction;
use App\Traits\Jobs; use App\Traits\Jobs;
use App\Traits\Relationships; use App\Traits\Relationships;
use Artisan; use Artisan;
@ -16,24 +19,34 @@ abstract class BulkAction
'enable' => [ 'enable' => [
'name' => 'general.enable', 'name' => 'general.enable',
'message' => 'bulk_actions.message.enable', 'message' => 'bulk_actions.message.enable',
'permission' => 'update-common-items' 'permission' => 'update-common-items',
], ],
'disable' => [ 'disable' => [
'name' => 'general.disable', 'name' => 'general.disable',
'message' => 'bulk_actions.message.disable', 'message' => 'bulk_actions.message.disable',
'permission' => 'update-common-items' 'permission' => 'update-common-items',
],
'export' => [
'name' => 'general.export',
'message' => 'bulk_actions.message.exports',
], ],
'delete' => [ 'delete' => [
'name' => 'general.delete', 'name' => 'general.delete',
'message' => 'bulk_actions.message.deletes', 'message' => 'bulk_actions.message.delete',
'permission' => 'delete-common-items' 'permission' => 'delete-common-items',
] ],
'export' => [
'name' => 'general.export',
'message' => 'bulk_actions.message.export',
],
]; ];
public function getSelectedRecords($request)
{
return $this->model::find($this->getSelectedInput($request));
}
public function getSelectedInput($request)
{
return $request->get('selected', []);
}
/** /**
* Duplicate the specified resource. * Duplicate the specified resource.
* *
@ -43,9 +56,7 @@ abstract class BulkAction
*/ */
public function duplicate($request) public function duplicate($request)
{ {
$selected = $request->get('selected', []); $items = $this->getSelectedRecords($request);
$items = $this->model::find($selected);
foreach ($items as $item) { foreach ($items as $item) {
$item->duplicate(); $item->duplicate();
@ -61,9 +72,7 @@ abstract class BulkAction
*/ */
public function enable($request) public function enable($request)
{ {
$selected = $request->get('selected', []); $items = $this->getSelectedRecords($request);
$items = $this->model::find($selected);
foreach ($items as $item) { foreach ($items as $item) {
$item->enabled = 1; $item->enabled = 1;
@ -80,9 +89,7 @@ abstract class BulkAction
*/ */
public function disable($request) public function disable($request)
{ {
$selected = $request->get('selected', []); $items = $this->getSelectedRecords($request);
$items = $this->model::find($selected);
foreach ($items as $item) { foreach ($items as $item) {
$item->enabled = 0; $item->enabled = 0;
@ -111,9 +118,7 @@ abstract class BulkAction
*/ */
public function destroy($request) public function destroy($request)
{ {
$selected = $request->get('selected', []); $items = $this->getSelectedRecords($request);
$items = $this->model::find($selected);
foreach ($items as $item) { foreach ($items as $item) {
$item->delete(); $item->delete();
@ -121,4 +126,43 @@ abstract class BulkAction
Artisan::call('cache:clear'); Artisan::call('cache:clear');
} }
public function disableContacts($request)
{
$contacts = $this->getSelectedRecords($request);
foreach ($contacts as $contact) {
try {
$this->dispatch(new UpdateContact($contact, request()->merge(['enabled' => 0])));
} catch (\Exception $e) {
flash($e->getMessage())->error();
}
}
}
public function deleteContacts($request)
{
$contacts = $this->getSelectedRecords($request);
foreach ($contacts as $contact) {
try {
$this->dispatch(new DeleteContact($contact));
} catch (\Exception $e) {
flash($e->getMessage())->error();
}
}
}
public function deleteTransactions($request)
{
$transactions = $this->getSelectedRecords($request);
foreach ($transactions as $transaction) {
try {
$this->dispatch(new DeleteTransaction($transaction));
} catch (\Exception $e) {
flash($e->getMessage())->error();
}
}
}
} }

View File

@ -12,8 +12,8 @@ class Permissions extends BulkAction
public $actions = [ public $actions = [
'delete' => [ 'delete' => [
'name' => 'general.delete', 'name' => 'general.delete',
'message' => 'bulk_actions.message.deletes', 'message' => 'bulk_actions.message.delete',
'permission' => 'delete-auth-permissions' 'permission' => 'delete-auth-permissions',
] ],
]; ];
} }

View File

@ -12,8 +12,8 @@ class Roles extends BulkAction
public $actions = [ public $actions = [
'delete' => [ 'delete' => [
'name' => 'general.delete', 'name' => 'general.delete',
'message' => 'bulk_actions.message.deletes', 'message' => 'bulk_actions.message.delete',
'permission' => 'delete-auth-roles' 'permission' => 'delete-auth-roles',
] ],
]; ];
} }

View File

@ -4,6 +4,7 @@ namespace App\BulkActions\Auth;
use App\Abstracts\BulkAction; use App\Abstracts\BulkAction;
use App\Jobs\Auth\DeleteUser; use App\Jobs\Auth\DeleteUser;
use App\Jobs\Auth\UpdateUser;
use App\Models\Auth\User; use App\Models\Auth\User;
class Users extends BulkAction class Users extends BulkAction
@ -14,54 +15,42 @@ class Users extends BulkAction
'enable' => [ 'enable' => [
'name' => 'general.enable', 'name' => 'general.enable',
'message' => 'bulk_actions.message.enable', 'message' => 'bulk_actions.message.enable',
'permission' => 'update-auth-users' 'permission' => 'update-auth-users',
], ],
'disable' => [ 'disable' => [
'name' => 'general.disable', 'name' => 'general.disable',
'message' => 'bulk_actions.message.disable', 'message' => 'bulk_actions.message.disable',
'permission' => 'update-auth-users' 'permission' => 'update-auth-users',
], ],
'delete' => [ 'delete' => [
'name' => 'general.delete', 'name' => 'general.delete',
'message' => 'bulk_actions.message.deletes', 'message' => 'bulk_actions.message.delete',
'permission' => 'delete-auth-users' 'permission' => 'delete-auth-users',
] ],
]; ];
public function disable($request) public function disable($request)
{ {
$selected = $request->get('selected', []); $users = $this->getSelectedRecords($request);
$users = $this->model::find($selected);
foreach ($users as $user) { foreach ($users as $user) {
// Can't disable yourself try {
if ($user->id == user()->id) { $this->dispatch(new UpdateUser($user, $request->merge(['enabled' => 0])));
continue; } catch (\Exception $e) {
//$this->response->errorMethodNotAllowed(trans('auth.error.self_delete')); flash($e->getMessage())->error();
} }
$user->enabled = 0;
$user->save();
} }
} }
public function delete($request)
{
$this->destroy($request);
}
public function destroy($request) public function destroy($request)
{ {
$selected = $request->get('selected', []); $users = $this->getSelectedRecords($request);
$users = $this->model::find($selected);
foreach ($users as $user) { foreach ($users as $user) {
try { try {
$this->dispatch(new DeleteUser($user)); $this->dispatch(new DeleteUser($user));
} catch (\Exception $e) { } catch (\Exception $e) {
return $e->getMessage(); flash($e->getMessage())->error();
} }
} }
} }

View File

@ -15,51 +15,42 @@ class Accounts extends BulkAction
'enable' => [ 'enable' => [
'name' => 'general.enable', 'name' => 'general.enable',
'message' => 'bulk_actions.message.enable', 'message' => 'bulk_actions.message.enable',
'permission' => 'update-banking-accounts' 'permission' => 'update-banking-accounts',
], ],
'disable' => [ 'disable' => [
'name' => 'general.disable', 'name' => 'general.disable',
'message' => 'bulk_actions.message.disable', 'message' => 'bulk_actions.message.disable',
'permission' => 'update-banking-accounts' 'permission' => 'update-banking-accounts',
], ],
'delete' => [ 'delete' => [
'name' => 'general.delete', 'name' => 'general.delete',
'message' => 'bulk_actions.message.deletes', 'message' => 'bulk_actions.message.delete',
'permission' => 'delete-banking-accounts' 'permission' => 'delete-banking-accounts',
] ],
]; ];
public function disable($request) public function disable($request)
{ {
$selected = $request->get('selected', []); $accounts = $this->getSelectedRecords($request);
$accounts = $this->model::find($selected);
foreach ($accounts as $account) { foreach ($accounts as $account) {
try { try {
$this->dispatch(new UpdateAccount($account, request()->merge(['enabled' => 1]))); $this->dispatch(new UpdateAccount($account, $request->merge(['enabled' => 0])));
} catch (\Exception $e) { } catch (\Exception $e) {
return $e->getMessage(); flash($e->getMessage())->error();
} }
} }
} }
public function delete($request)
{
$this->destroy($request);
}
public function destroy($request) public function destroy($request)
{ {
$selected = $request->get('selected', []); $accounts = $this->getSelectedRecords($request);
$accounts = $this->model::find($selected);
foreach ($accounts as $account) { foreach ($accounts as $account) {
try { try {
$this->dispatch(new DeleteAccount($account)); $this->dispatch(new DeleteAccount($account));
} catch (\Exception $e) { } catch (\Exception $e) {
return $e->getMessage(); flash($e->getMessage())->error();
} }
} }
} }

View File

@ -14,25 +14,23 @@ class Reconciliations extends BulkAction
'enable' => [ 'enable' => [
'name' => 'general.enable', 'name' => 'general.enable',
'message' => 'bulk_actions.message.enable', 'message' => 'bulk_actions.message.enable',
'permission' => 'update-banking-reconciliations' 'permission' => 'update-banking-reconciliations',
], ],
'disable' => [ 'disable' => [
'name' => 'general.disable', 'name' => 'general.disable',
'message' => 'bulk_actions.message.disable', 'message' => 'bulk_actions.message.disable',
'permission' => 'update-banking-reconciliations' 'permission' => 'update-banking-reconciliations',
], ],
'delete' => [ 'delete' => [
'name' => 'general.delete', 'name' => 'general.delete',
'message' => 'bulk_actions.message.deletes', 'message' => 'bulk_actions.message.delete',
'permission' => 'delete-banking-reconciliations' 'permission' => 'delete-banking-reconciliations',
] ],
]; ];
public function enable($request) public function enable($request)
{ {
$selected = $request->get('selected', []); $reconciliations = $this->getSelectedRecords($request);
$reconciliations = $this->model::find($selected);
foreach ($reconciliations as $reconciliation) { foreach ($reconciliations as $reconciliation) {
$reconciliation->enabled = 1; $reconciliation->enabled = 1;
@ -49,9 +47,7 @@ class Reconciliations extends BulkAction
public function disable($request) public function disable($request)
{ {
$selected = $request->get('selected', []); $reconciliations = $this->getSelectedRecords($request);
$reconciliations = $this->model::find($selected);
foreach ($reconciliations as $reconciliation) { foreach ($reconciliations as $reconciliation) {
$reconciliation->enabled = 0; $reconciliation->enabled = 0;
@ -66,16 +62,9 @@ class Reconciliations extends BulkAction
} }
} }
public function delete($request)
{
$this->destroy($request);
}
public function destroy($request) public function destroy($request)
{ {
$selected = $request->get('selected', []); $reconciliations = $this->getSelectedRecords($request);
$reconciliations = $this->model::find($selected);
foreach ($reconciliations as $reconciliation) { foreach ($reconciliations as $reconciliation) {
$reconciliation->delete(); $reconciliation->delete();

View File

@ -14,23 +14,20 @@ class Transfers extends BulkAction
'delete' => [ 'delete' => [
'name' => 'general.delete', 'name' => 'general.delete',
'message' => 'bulk_action.message.deletes', 'message' => 'bulk_action.message.deletes',
'permission' => 'delete-banking-transfers' 'permission' => 'delete-banking-transfers',
] ],
]; ];
public function delete($request)
{
$this->destroy($request);
}
public function destroy($request) public function destroy($request)
{ {
$selected = $request->get('selected', []); $transfers = $this->getSelectedRecords($request);
$transfers = $this->model::find($selected);
foreach ($transfers as $transfer) { foreach ($transfers as $transfer) {
$this->dispatch(new DeleteTransfer($transfer)); try {
$this->dispatch(new DeleteTransfer($transfer));
} catch (\Exception $e) {
flash($e->getMessage())->error();
}
} }
} }
} }

View File

@ -3,6 +3,8 @@
namespace App\BulkActions\Common; namespace App\BulkActions\Common;
use App\Abstracts\BulkAction; use App\Abstracts\BulkAction;
use App\Jobs\Common\DeleteCompany;
use App\Jobs\Common\UpdateCompany;
use App\Models\Common\Company; use App\Models\Common\Company;
class Companies extends BulkAction class Companies extends BulkAction
@ -13,104 +15,56 @@ class Companies extends BulkAction
'enable' => [ 'enable' => [
'name' => 'general.enable', 'name' => 'general.enable',
'message' => 'bulk_actions.message.enable', 'message' => 'bulk_actions.message.enable',
'permission' => 'update-common-companies' 'permission' => 'update-common-companies',
], ],
'disable' => [ 'disable' => [
'name' => 'general.disable', 'name' => 'general.disable',
'message' => 'bulk_actions.message.disable', 'message' => 'bulk_actions.message.disable',
'permission' => 'update-common-companies' 'permission' => 'update-common-companies',
], ],
'delete' => [ 'delete' => [
'name' => 'general.delete', 'name' => 'general.delete',
'message' => 'bulk_actions.message.deletes', 'message' => 'bulk_actions.message.delete',
'permission' => 'delete-common-companies' 'permission' => 'delete-common-companies',
] ],
]; ];
public function enable($request) public function enable($request)
{ {
try { $companies = $this->getSelectedRecords($request);
$selected = $request->get('selected', []);
$companies = $this->model::find($selected); foreach ($companies as $company) {
try {
foreach ($companies as $company) { $this->dispatch(new UpdateCompany($company, $request->merge(['enabled' => 1])));
// Check if user can access company } catch (\Exception $e) {
$this->owner($company); flash($e->getMessage())->error();
$company->enabled = 1;
$company->save();
} }
$message = trans('messages.success.enabled', ['type' => $company->name]);
return $this->itemResponse($company->fresh(), new Transformer(), $message);
} catch (\HttpException $e) {
$this->response->errorUnauthorized(trans('companies.error.not_user_company'));
} }
} }
public function disable($request) public function disable($request)
{ {
try { $companies = $this->getSelectedRecords($request);
$selected = $request->get('selected', []);
$companies = $this->model::find($selected); foreach ($companies as $company) {
try {
foreach ($companies as $company) { $this->dispatch(new UpdateCompany($company, $request->merge(['enabled' => 0])));
// Check if user can access company } catch (\Exception $e) {
$this->owner($company); flash($e->getMessage())->error();
$company->enabled = 0;
$company->save();
} }
} catch (\HttpException $e) {
$this->response->errorUnauthorized(trans('companies.error.not_user_company'));
} }
} }
public function delete($request)
{
$this->destroy($request);
}
public function destroy($request) public function destroy($request)
{ {
$selected = $request->get('selected', []); $companies = $this->getSelectedRecords($request);
$companies = $this->model::find($selected);
foreach ($companies as $company) { foreach ($companies as $company) {
// Can't delete active company
if ($company->id == session('company_id')) {
$content = trans('companies.error.delete_active');
return new Response($content, 422);
}
try { try {
// Check if user can access company $this->dispatch(new DeleteCompany($company));
$this->owner($company); } catch (\Exception $e) {
flash($e->getMessage())->error();
$company->delete();
$message = trans('messages.success.deleted', ['type' => $company->name]);
flash($message)->success();
} catch (\HttpException $e) {
$this->response->errorUnauthorized(trans('companies.error.not_user_company'));
} }
} }
} }
public function owner(Company $company)
{
$companies = user()->companies()->pluck('id')->toArray();
if (in_array($company->id, $companies)) {
return new Response('');
}
$this->response->errorUnauthorized(trans('companies.error.not_user_company'));
}
} }

View File

@ -4,6 +4,8 @@ namespace App\BulkActions\Common;
use App\Abstracts\BulkAction; use App\Abstracts\BulkAction;
use App\Exports\Common\Items as Export; use App\Exports\Common\Items as Export;
use App\Jobs\Common\DeleteItem;
use App\Jobs\Common\UpdateItem;
use App\Models\Common\Item; use App\Models\Common\Item;
class Items extends BulkAction class Items extends BulkAction
@ -14,76 +16,46 @@ class Items extends BulkAction
'enable' => [ 'enable' => [
'name' => 'general.enable', 'name' => 'general.enable',
'message' => 'bulk_actions.message.enable', 'message' => 'bulk_actions.message.enable',
'permission' => 'update-common-items' 'permission' => 'update-common-items',
], ],
'disable' => [ 'disable' => [
'name' => 'general.disable', 'name' => 'general.disable',
'message' => 'bulk_actions.message.disable', 'message' => 'bulk_actions.message.disable',
'permission' => 'update-common-items' 'permission' => 'update-common-items',
], ],
'duplicate' => [ 'duplicate' => [
'name' => 'general.duplicate', 'name' => 'general.duplicate',
'message' => 'bulk_actions.message.duplicate', 'message' => 'bulk_actions.message.duplicate',
'permission' => 'create-common-items', 'permission' => 'create-common-items',
'multiple' => true 'multiple' => true,
],
'export' => [
'name' => 'general.export',
'message' => 'bulk_actions.message.exports',
], ],
'delete' => [ 'delete' => [
'name' => 'general.delete', 'name' => 'general.delete',
'message' => 'bulk_actions.message.deletes', 'message' => 'bulk_actions.message.delete',
'permission' => 'delete-common-items' 'permission' => 'delete-common-items',
] ],
'export' => [
'name' => 'general.export',
'message' => 'bulk_actions.message.export',
],
]; ];
/**
* Remove the specified resource from storage.
*
* @param $id
*
* @return Response
*/
public function delete($request)
{
$this->destroy($request);
}
public function destroy($request) public function destroy($request)
{ {
$selected = $request->get('selected', []); $items = $this->getSelectedRecords($request);
$items = $this->model::find($selected);
foreach ($items as $item) { foreach ($items as $item) {
$relationships = $this->countRelationships($item, [ try {
'invoice_items' => 'invoices', $this->dispatch(new DeleteItem($item));
'bill_items' => 'bills', } catch (\Exception $e) {
]); flash($e->getMessage())->error();
if (empty($relationships)) {
$item->delete();
$message = trans('messages.success.deleted', ['type' => $item->name]);
flash($message)->success();
} else {
$message = trans('messages.warning.deleted', ['name' => $item->name, 'text' => implode(', ', $relationships)]);
$this->response->errorUnauthorized($message);
} }
} }
} }
/**
* Export the specified resource.
*
* @return Response
*/
public function export($request) public function export($request)
{ {
$selected = $request->get('selected', []); $selected = $this->getSelectedInput($request);
return \Excel::download(new Export($selected), trans_choice('general.items', 2) . '.xlsx'); return \Excel::download(new Export($selected), trans_choice('general.items', 2) . '.xlsx');
} }

View File

@ -4,9 +4,9 @@ namespace App\BulkActions\Expenses;
use App\Abstracts\BulkAction; use App\Abstracts\BulkAction;
use App\Exports\Expenses\Bills as Export; use App\Exports\Expenses\Bills as Export;
use App\Jobs\Expense\CreateBillHistory;
use App\Jobs\Expense\DeleteBill; use App\Jobs\Expense\DeleteBill;
use App\Models\Expense\Bill; use App\Models\Expense\Bill;
use App\Models\Expense\BillHistory;
class Bills extends BulkAction class Bills extends BulkAction
{ {
@ -14,88 +14,71 @@ class Bills extends BulkAction
public $actions = [ public $actions = [
'received' => [ 'received' => [
'name' => 'general.received', 'name' => 'bills.mark_received',
'message' => '', 'message' => 'bulk_actions.message.received',
'permission' => 'update-expenses-bills' 'permission' => 'update-expenses-bills',
], ],
'duplicate' => [ 'duplicate' => [
'name' => 'general.duplicate', 'name' => 'general.duplicate',
'message' => 'bulk_actions.message.duplicate', 'message' => 'bulk_actions.message.duplicate',
'permission' => 'create-expenses-bills', 'permission' => 'create-expenses-bills',
'multiple' => true 'multiple' => true,
],
'export' => [
'name' => 'general.export',
'message' => 'bulk_actions.message.exports',
], ],
'delete' => [ 'delete' => [
'name' => 'general.delete', 'name' => 'general.delete',
'message' => 'bulk_actions.message.deletes', 'message' => 'bulk_actions.message.delete',
'permission' => 'delete-expenses-bills' 'permission' => 'delete-expenses-bills',
] ],
'export' => [
'name' => 'general.export',
'message' => 'bulk_actions.message.export',
],
]; ];
public function duplicate($request)
{
$selected = $request->get('selected', []);
$bills = $this->model::find($selected);
foreach ($bills as $bill) {
$clone = $bill->duplicate();
// Add bill history
BillHistory::create([
'company_id' => session('company_id'),
'bill_id' => $clone->id,
'status_code' => 'draft',
'notify' => 0,
'description' => trans('messages.success.added', ['type' => $clone->bill_number]),
]);
}
}
public function delete($request)
{
$this->destroy($request);
}
public function destroy($request)
{
$selected = $request->get('selected', []);
$bills = $this->model::find($selected);
foreach ($bills as $bill) {
$this->dispatch(new DeleteBill($bill));
}
}
public function export($request)
{
$selected = $request->get('selected', []);
return \Excel::download(new Export($selected), trans_choice('general.bills', 2) . '.xlsx');
}
public function received($request) public function received($request)
{ {
$selected = $request->get('selected', []); $bills = $this->getSelectedRecords($request);
$bills = $this->model::find($selected);
foreach ($bills as $bill) { foreach ($bills as $bill) {
$bill->bill_status_code = 'received'; $bill->bill_status_code = 'received';
$bill->save(); $bill->save();
// Add bill history $description = trans('bills.mark_recevied');
BillHistory::create([
'company_id' => $bill->company_id, $this->dispatch(new CreateBillHistory($bill, 0, $description));
'bill_id' => $bill->id,
'status_code' => 'received',
'notify' => 0,
'description' => trans('bills.mark_recevied'),
]);
} }
} }
public function duplicate($request)
{
$bills = $this->getSelectedRecords($request);
foreach ($bills as $bill) {
$clone = $bill->duplicate();
$description = trans('messages.success.added', ['type' => $clone->bill_number]);
$this->dispatch(new CreateBillHistory($clone, 0, $description));
}
}
public function destroy($request)
{
$bills = $this->getSelectedRecords($request);
foreach ($bills as $bill) {
try {
$this->dispatch(new DeleteBill($bill));
} catch (\Exception $e) {
flash($e->getMessage())->error();
}
}
}
public function export($request)
{
$selected = $this->getSelectedInput($request);
return \Excel::download(new Export($selected), trans_choice('general.bills', 2) . '.xlsx');
}
} }

View File

@ -5,7 +5,6 @@ namespace App\BulkActions\Expenses;
use App\Abstracts\BulkAction; use App\Abstracts\BulkAction;
use App\Exports\Expenses\Payments as Export; use App\Exports\Expenses\Payments as Export;
use App\Models\Banking\Transaction; use App\Models\Banking\Transaction;
use App\Models\Setting\Category;
class Payments extends BulkAction class Payments extends BulkAction
{ {
@ -16,60 +15,27 @@ class Payments extends BulkAction
'name' => 'general.duplicate', 'name' => 'general.duplicate',
'message' => 'bulk_actions.message.duplicate', 'message' => 'bulk_actions.message.duplicate',
'permission' => 'create-expenses-payments', 'permission' => 'create-expenses-payments',
'multiple' => true 'multiple' => true,
], ],
'export' => [ 'export' => [
'name' => 'general.export', 'name' => 'general.export',
'message' => 'bulk_actions.message.exports', 'message' => 'bulk_actions.message.export',
], ],
'delete' => [ 'delete' => [
'name' => 'general.delete', 'name' => 'general.delete',
'message' => 'bulk_actions.message.deletes', 'message' => 'bulk_actions.message.delete',
'permission' => 'delete-expenses-payments' 'permission' => 'delete-expenses-payments',
] ],
]; ];
public function duplicate($request)
{
$selected = $request->get('selected', []);
$transactions = $this->model::find($selected);
foreach ($transactions as $transaction) {
$clone = $transaction->duplicate();
}
}
public function delete($request)
{
$this->destroy($request);
}
public function destroy($request) public function destroy($request)
{ {
$selected = $request->get('selected', []); $this->deleteTransactions($request);
$transactions = $this->model::find($selected);
foreach ($transactions as $transaction) {
if ($transaction->category->id != Category::transfer()) {
$type = $transaction->type;
$transaction->recurring()->delete();
$transaction->delete();
$message = trans('messages.success.deleted', ['type' => trans_choice('general.' . \Str::plural($type), 1)]);
flash($message)->success();
} else {
$this->response->errorUnauthorized();
}
}
} }
public function export($request) public function export($request)
{ {
$selected = $request->get('selected', []); $selected = $this->getSelectedInput($request);
return \Excel::download(new Export($selected), trans_choice('general.payments', 2) . '.xlsx'); return \Excel::download(new Export($selected), trans_choice('general.payments', 2) . '.xlsx');
} }

View File

@ -4,6 +4,7 @@ namespace App\BulkActions\Expenses;
use App\Abstracts\BulkAction; use App\Abstracts\BulkAction;
use App\Exports\Expenses\Vendors as Export; use App\Exports\Expenses\Vendors as Export;
use App\Jobs\Common\UpdateContact;
use App\Models\Common\Contact; use App\Models\Common\Contact;
class Vendors extends BulkAction class Vendors extends BulkAction
@ -14,12 +15,12 @@ class Vendors extends BulkAction
'enable' => [ 'enable' => [
'name' => 'general.enable', 'name' => 'general.enable',
'message' => 'bulk_actions.message.enable', 'message' => 'bulk_actions.message.enable',
'permission' => 'update-expenses-vendors' 'permission' => 'update-expenses-vendors',
], ],
'disable' => [ 'disable' => [
'name' => 'general.disable', 'name' => 'general.disable',
'message' => 'bulk_actions.message.disable', 'message' => 'bulk_actions.message.disable',
'permission' => 'update-expenses-vendors' 'permission' => 'update-expenses-vendors',
], ],
'duplicate' => [ 'duplicate' => [
'name' => 'general.duplicate', 'name' => 'general.duplicate',
@ -27,70 +28,31 @@ class Vendors extends BulkAction
'permission' => 'create-expenses-vendors', 'permission' => 'create-expenses-vendors',
'multiple' => true 'multiple' => true
], ],
'export' => [
'name' => 'general.export',
'message' => 'bulk_actions.message.exports',
],
'delete' => [ 'delete' => [
'name' => 'general.delete', 'name' => 'general.delete',
'message' => 'bulk_actions.message.deletes', 'message' => 'bulk_actions.message.delete',
'permission' => 'delete-expenses-vendors' 'permission' => 'delete-expenses-vendors',
] ],
'export' => [
'name' => 'general.export',
'message' => 'bulk_actions.message.export',
],
]; ];
public function duplicate($request) public function disable($request)
{ {
$selected = $request->get('selected', []); $this->disableContacts($request);
$contacts = $this->model::find($selected);
foreach ($contacts as $contact) {
$clone = $contact->duplicate();
}
}
public function delete($request)
{
$this->destroy($request);
} }
public function destroy($request) public function destroy($request)
{ {
$selected = $request->get('selected', []); $this->deleteContacts($request);
$contacts = $this->model::find($selected);
foreach ($contacts as $contact) {
if (!$relationships = $this->getRelationships($contact)) {
$contact->delete();
$message = trans('messages.success.deleted', ['type' => $contact->name]);
flash($message)->success();
} else {
$message = trans('messages.warning.deleted', ['name' => $contact->name, 'text' => implode(', ', $relationships)]);
$this->response->errorUnauthorized($message);
}
}
} }
public function export($request) public function export($request)
{ {
$selected = $request->get('selected', []); $selected = $this->getSelectedInput($request);
return \Excel::download(new Export($selected), trans_choice('general.vendors', 2) . '.xlsx'); return \Excel::download(new Export($selected), trans_choice('general.vendors', 2) . '.xlsx');
} }
protected function getRelationships($contact)
{
$rels = [
'bills' => 'bills',
'payments' => 'payments',
];
$relationships = $this->countRelationships($contact, $rels);
return $relationships;
}
} }

View File

@ -14,12 +14,12 @@ class Customers extends BulkAction
'enable' => [ 'enable' => [
'name' => 'general.enable', 'name' => 'general.enable',
'message' => 'bulk_actions.message.enable', 'message' => 'bulk_actions.message.enable',
'permission' => 'update-incomes-customers' 'permission' => 'update-incomes-customers',
], ],
'disable' => [ 'disable' => [
'name' => 'general.disable', 'name' => 'general.disable',
'message' => 'bulk_actions.message.disable', 'message' => 'bulk_actions.message.disable',
'permission' => 'update-incomes-customers' 'permission' => 'update-incomes-customers',
], ],
'duplicate' => [ 'duplicate' => [
'name' => 'general.duplicate', 'name' => 'general.duplicate',
@ -27,70 +27,31 @@ class Customers extends BulkAction
'permission' => 'create-incomes-customers', 'permission' => 'create-incomes-customers',
'multiple' => true 'multiple' => true
], ],
'delete' => [
'name' => 'general.delete',
'message' => 'bulk_actions.message.delete',
'permission' => 'delete-incomes-customers',
],
'export' => [ 'export' => [
'name' => 'general.export', 'name' => 'general.export',
'message' => 'bulk_actions.message.export', 'message' => 'bulk_actions.message.export',
], ],
'delete' => [
'name' => 'general.delete',
'message' => 'bulk_actions.message.deletes',
'permission' => 'delete-incomes-customers'
]
]; ];
public function duplicate($request) public function disable($request)
{ {
$selected = $request->get('selected', []); $this->disableContacts($request);
$contacts = $this->model::find($selected);
foreach ($contacts as $contact) {
$clone = $contact->duplicate();
}
}
public function delete($request)
{
$this->destroy($request);
} }
public function destroy($request) public function destroy($request)
{ {
$selected = $request->get('selected', []); $this->deleteContacts($request);
$contacts = $this->model::find($selected);
foreach ($contacts as $contact) {
if (!$relationships = $this->getRelationships($contact)) {
$contact->delete();
$message = trans('messages.success.deleted', ['type' => $contact->name]);
flash($message)->success();
} else {
$message = trans('messages.warning.deleted', ['name' => $contact->name, 'text' => implode(', ', $relationships)]);
$this->response->errorUnauthorized($message);
}
}
} }
public function export($request) public function export($request)
{ {
$selected = $request->get('selected', []); $selected = $this->getSelectedInput($request);
return \Excel::download(new Export($selected), trans_choice('general.customers', 2) . '.xlsx'); return \Excel::download(new Export($selected), trans_choice('general.customers', 2) . '.xlsx');
} }
protected function getRelationships($contact)
{
$rels = [
'invoices' => 'invoices',
'income_transactions' => 'transactions',
];
$relationships = $this->countRelationships($contact, $rels);
return $relationships;
}
} }

View File

@ -9,7 +9,6 @@ use App\Events\Income\PaymentReceived;
use App\Exports\Incomes\Invoices as Export; use App\Exports\Incomes\Invoices as Export;
use App\Jobs\Income\DeleteInvoice; use App\Jobs\Income\DeleteInvoice;
use App\Models\Income\Invoice; use App\Models\Income\Invoice;
use Date;
class Invoices extends BulkAction class Invoices extends BulkAction
{ {
@ -17,37 +16,53 @@ class Invoices extends BulkAction
public $actions = [ public $actions = [
'paid' => [ 'paid' => [
'name' => 'general.disable', 'name' => 'invoices.mark_paid',
'message' => 'bulk_actions.message.disable', 'message' => 'bulk_actions.message.paid',
'permission' => 'update-incomes-invoices' 'permission' => 'update-incomes-invoices',
], ],
'sent' => [ 'sent' => [
'name' => 'general.enable', 'name' => 'invoice.mark_sent',
'message' => 'bulk_actions.message.enable', 'message' => 'bulk_actions.message.sent',
'permission' => 'update-incomes-invoices' 'permission' => 'update-incomes-invoices',
], ],
'duplicate' => [ 'duplicate' => [
'name' => 'general.duplicate', 'name' => 'general.duplicate',
'message' => 'bulk_actions.message.duplicate', 'message' => 'bulk_actions.message.duplicate',
'permission' => 'create-incomes-invoices', 'permission' => 'create-incomes-invoices',
'multiple' => true 'multiple' => true,
],
'export' => [
'name' => 'general.export',
'message' => 'bulk_actions.message.exports',
], ],
'delete' => [ 'delete' => [
'name' => 'general.delete', 'name' => 'general.delete',
'message' => 'bulk_actions.message.deletes', 'message' => 'bulk_actions.message.delete',
'permission' => 'delete-incomes-invoices' 'permission' => 'delete-incomes-invoices',
] ],
'export' => [
'name' => 'general.export',
'message' => 'bulk_actions.message.export',
],
]; ];
public function paid($request)
{
$invoices = $this->getSelectedRecords($request);
foreach ($invoices as $invoice) {
event(new PaymentReceived($invoice, []));
}
}
public function sent($request)
{
$invoices = $this->getSelectedRecords($request);
foreach ($invoices as $invoice) {
event(new InvoiceSent($invoice));
}
}
public function duplicate($request) public function duplicate($request)
{ {
$selected = $request->get('selected', []); $invoices = $this->getSelectedRecords($request);
$invoices = $this->model::find($selected);
foreach ($invoices as $invoice) { foreach ($invoices as $invoice) {
$clone = $invoice->duplicate(); $clone = $invoice->duplicate();
@ -63,43 +78,21 @@ class Invoices extends BulkAction
public function destroy($request) public function destroy($request)
{ {
$selected = $request->get('selected', []); $invoices = $this->getSelectedRecords($request);
$invoices = $this->model::find($selected);
foreach ($invoices as $invoice) { foreach ($invoices as $invoice) {
$this->dispatch(new DeleteInvoice($invoice)); try {
$this->dispatch(new DeleteInvoice($invoice));
} catch (\Exception $e) {
flash($e->getMessage())->error();
}
} }
} }
public function export($request) public function export($request)
{ {
$selected = $request->get('selected', []); $selected = $this->getSelectedInput($request);
return \Excel::download(new Export($selected), trans_choice('general.invoices', 2) . '.xlsx'); return \Excel::download(new Export($selected), trans_choice('general.invoices', 2) . '.xlsx');
} }
public function sent($request)
{
$selected = $request->get('selected', []);
$invoices = $this->model::find($selected);
foreach ($invoices as $invoice) {
event(new InvoiceSent($invoice));
$message = trans('invoices.messages.marked_sent');
}
}
public function paid($request)
{
$selected = $request->get('selected', []);
$invoices = $this->model::find($selected);
foreach ($invoices as $invoice) {
event(new PaymentReceived($invoice, []));
}
}
} }

View File

@ -5,7 +5,6 @@ namespace App\BulkActions\Incomes;
use App\Abstracts\BulkAction; use App\Abstracts\BulkAction;
use App\Exports\Incomes\Revenues as Export; use App\Exports\Incomes\Revenues as Export;
use App\Models\Banking\Transaction; use App\Models\Banking\Transaction;
use App\Models\Setting\Category;
class Revenues extends BulkAction class Revenues extends BulkAction
{ {
@ -14,62 +13,29 @@ class Revenues extends BulkAction
public $actions = [ public $actions = [
'export' => [ 'export' => [
'name' => 'general.export', 'name' => 'general.export',
'message' => 'bulk_actions.message.exports', 'message' => 'bulk_actions.message.export',
], ],
'duplicate' => [ 'duplicate' => [
'name' => 'general.duplicate', 'name' => 'general.duplicate',
'message' => 'bulk_actions.message.duplicate', 'message' => 'bulk_actions.message.duplicate',
'permission' => 'create-incomes-revenues', 'permission' => 'create-incomes-revenues',
'multiple' => true 'multiple' => true,
], ],
'delete' => [ 'delete' => [
'name' => 'general.delete', 'name' => 'general.delete',
'message' => 'bulk_actions.message.deletes', 'message' => 'bulk_actions.message.delete',
'permission' => 'delete-incomes-revenues' 'permission' => 'delete-incomes-revenues',
] ],
]; ];
public function duplicate($request)
{
$selected = $request->get('selected', []);
$transactions = $this->model::find($selected);
foreach ($transactions as $transaction) {
$clone = $transaction->duplicate();
}
}
public function delete($request)
{
$this->destroy($request);
}
public function destroy($request) public function destroy($request)
{ {
$selected = $request->get('selected', []); $this->deleteTransactions($request);
$transactions = $this->model::find($selected);
foreach ($transactions as $transaction) {
if ($transaction->category->id != Category::transfer()) {
$type = $transaction->type;
$transaction->recurring()->delete();
$transaction->delete();
$message = trans('messages.success.deleted', ['type' => trans_choice('general.' . \Str::plural($type), 1)]);
flash($message)->success();
} else {
$this->response->errorUnauthorized();
}
}
} }
public function export($request) public function export($request)
{ {
$selected = $request->get('selected', []); $selected = $this->getSelectedInput($request);
return \Excel::download(new Export($selected), trans_choice('general.revenues', 2) . '.xlsx'); return \Excel::download(new Export($selected), trans_choice('general.revenues', 2) . '.xlsx');
} }

View File

@ -3,6 +3,8 @@
namespace App\BulkActions\Settings; namespace App\BulkActions\Settings;
use App\Abstracts\BulkAction; use App\Abstracts\BulkAction;
use App\Jobs\Setting\DeleteCategory;
use App\Jobs\Setting\UpdateCategory;
use App\Models\Setting\Category; use App\Models\Setting\Category;
class Categories extends BulkAction class Categories extends BulkAction
@ -13,85 +15,43 @@ class Categories extends BulkAction
'enable' => [ 'enable' => [
'name' => 'general.enable', 'name' => 'general.enable',
'message' => 'bulk_actions.message.enable', 'message' => 'bulk_actions.message.enable',
'permission' => 'update-settings-categories' 'permission' => 'update-settings-categories',
], ],
'disable' => [ 'disable' => [
'name' => 'general.disable', 'name' => 'general.disable',
'message' => 'bulk_actions.message.disable', 'message' => 'bulk_actions.message.disable',
'permission' => 'update-settings-categories' 'permission' => 'update-settings-categories',
], ],
'delete' => [ 'delete' => [
'name' => 'general.delete', 'name' => 'general.delete',
'message' => 'bulk_actions.message.deletes', 'message' => 'bulk_actions.message.delete',
'permission' => 'delete-settings-categories' 'permission' => 'delete-settings-categories',
] ],
]; ];
public function disable($request) public function disable($request)
{ {
$selected = $request->get('selected', []); $categories = $this->getSelectedRecords($request);
$categories = $this->model::find($selected);
foreach ($categories as $category) { foreach ($categories as $category) {
if ($relationships = $this->getRelationships($category)) { try {
$category->enabled = 0; $this->dispatch(new UpdateCategory($category, $request->merge(['enabled' => 0])));
$category->save(); } catch (\Exception $e) {
flash($e->getMessage())->error();
$message = trans('messages.success.disabled', ['type' => $category->name]);
flash($message)->success();
} else {
$message = trans('messages.warning.disabled', ['name' => $category->name, 'text' => implode(', ', $relationships)]);
$this->response->errorUnauthorized($message);
} }
} }
} }
public function delete($request)
{
$this->destroy($request);
}
public function destroy($request) public function destroy($request)
{ {
$selected = $request->get('selected', []); $categories = $this->getSelectedRecords($request);
$categories = $this->model::find($selected);
foreach ($categories as $category) { foreach ($categories as $category) {
// Can not delete the last category by type try {
if (Category::where('type', $category->type)->count() == 1) { $this->dispatch(new DeleteCategory($category));
$message = trans('messages.error.last_category', ['type' => strtolower(trans_choice('general.' . $category->type . 's', 1))]); } catch (\Exception $e) {
flash($e->getMessage())->error();
$this->response->errorUnauthorized($message);
}
if (!$relationships = $this->getRelationships($category)) {
$category->delete();
$message = trans('messages.success.deleted', ['type' => $category->name]);
return new Response($message);
} else {
$message = trans('messages.warning.deleted', ['name' => $category->name, 'text' => implode(', ', $relationships)]);
$this->response->errorUnauthorized($message);
} }
} }
} }
protected function getRelationships($category)
{
$relationships = $this->countRelationships($category, [
'items' => 'items',
'invoices' => 'invoices',
'income_transacions' => 'transactions',
'bills' => 'bills',
'expense_transactions' => 'transactions',
]);
return $relationships;
}
} }

View File

@ -3,6 +3,8 @@
namespace App\BulkActions\Settings; namespace App\BulkActions\Settings;
use App\Abstracts\BulkAction; use App\Abstracts\BulkAction;
use App\Jobs\Setting\DeleteCurrency;
use App\Jobs\Setting\UpdateCurrency;
use App\Models\Setting\Currency; use App\Models\Setting\Currency;
class Currencies extends BulkAction class Currencies extends BulkAction
@ -13,83 +15,43 @@ class Currencies extends BulkAction
'enable' => [ 'enable' => [
'name' => 'general.enable', 'name' => 'general.enable',
'message' => 'bulk_actions.message.enable', 'message' => 'bulk_actions.message.enable',
'permission' => 'update-settings-currencies' 'permission' => 'update-settings-currencies',
], ],
'disable' => [ 'disable' => [
'name' => 'general.disable', 'name' => 'general.disable',
'message' => 'bulk_actions.message.disable', 'message' => 'bulk_actions.message.disable',
'permission' => 'update-settings-currencies' 'permission' => 'update-settings-currencies',
], ],
'delete' => [ 'delete' => [
'name' => 'general.delete', 'name' => 'general.delete',
'message' => 'bulk_actions.message.deletes', 'message' => 'bulk_actions.message.delete',
'permission' => 'delete-settings-currencies' 'permission' => 'delete-settings-currencies',
] ],
]; ];
public function disable($request) public function disable($request)
{ {
$selected = $request->get('selected', []); $currencies = $this->getSelectedRecords($request);
$currencies = $this->model::find($selected);
foreach ($currencies as $currency) { foreach ($currencies as $currency) {
if (!$relationships = $this->getRelationships($currency)) { try {
$currency->enabled = 0; $this->dispatch(new UpdateCurrency($currency, $request->merge(['enabled' => 0])));
$currency->save(); } catch (\Exception $e) {
flash($e->getMessage())->error();
$message = trans('messages.success.disabled', ['type' => $currency->name]);
return $this->itemResponse($currency->fresh(), new Transformer(), $message);
} else {
$message = trans('messages.warning.disabled', ['name' => $currency->name, 'text' => implode(', ', $relationships)]);
$this->response->errorUnauthorized($message);
} }
} }
} }
public function delete($request)
{
$this->destroy($request);
}
public function destroy($request) public function destroy($request)
{ {
$selected = $request->get('selected', []); $currencies = $this->getSelectedRecords($request);
$currencies = $this->model::find($selected);
foreach ($currencies as $currency) { foreach ($currencies as $currency) {
if (!$relationships = $this->getRelationships($currency)) { try {
$currency->delete(); $this->dispatch(new DeleteCurrency($currency));
} catch (\Exception $e) {
$message = trans('messages.success.deleted', ['type' => $currency->name]); flash($e->getMessage())->error();
flash($message)->success();
} else {
$message = trans('messages.warning.deleted', ['name' => $currency->name, 'text' => implode(', ', $relationships)]);
$this->response->errorUnauthorized($message);
} }
} }
} }
protected function getRelationships($currency)
{
$relationships = $this->countRelationships($currency, [
'accounts' => 'accounts',
'customers' => 'customers',
'invoices' => 'invoices',
'income_transactions' => 'transactions',
'bills' => 'bills',
'expense_transactions' => 'transactions',
]);
if ($currency->code == setting('default.currency')) {
$relationships[] = strtolower(trans_choice('general.companies', 1));
}
return $relationships;
}
} }

View File

@ -3,6 +3,8 @@
namespace App\BulkActions\Settings; namespace App\BulkActions\Settings;
use App\Abstracts\BulkAction; use App\Abstracts\BulkAction;
use App\Jobs\Setting\DeleteTax;
use App\Jobs\Setting\UpdateTax;
use App\Models\Setting\Tax; use App\Models\Setting\Tax;
class Taxes extends BulkAction class Taxes extends BulkAction
@ -13,76 +15,43 @@ class Taxes extends BulkAction
'enable' => [ 'enable' => [
'name' => 'general.enable', 'name' => 'general.enable',
'message' => 'bulk_actions.message.enable', 'message' => 'bulk_actions.message.enable',
'permission' => 'update-settings-taxes' 'permission' => 'update-settings-taxes',
], ],
'disable' => [ 'disable' => [
'name' => 'general.disable', 'name' => 'general.disable',
'message' => 'bulk_actions.message.disable', 'message' => 'bulk_actions.message.disable',
'permission' => 'update-settings-taxes' 'permission' => 'update-settings-taxes',
], ],
'delete' => [ 'delete' => [
'name' => 'general.delete', 'name' => 'general.delete',
'message' => 'bulk_actions.message.deletes', 'message' => 'bulk_actions.message.delete',
'permission' => 'delete-settings-taxes' 'permission' => 'delete-settings-taxes',
] ],
]; ];
public function disable($request) public function disable($request)
{ {
$selected = $request->get('selected', []); $taxes = $this->getSelectedRecords($request);
$taxes = $this->model::find($selected);
foreach ($taxes as $tax) { foreach ($taxes as $tax) {
if (!$relationships = $this->getRelationships($tax)) { try {
$tax->enabled = 0; $this->dispatch(new UpdateTax($tax, $request->merge(['enabled' => 0])));
$tax->save(); } catch (\Exception $e) {
flash($e->getMessage())->error();
$message = trans('messages.success.disabled', ['type' => $tax->name]);
return $this->itemResponse($tax->fresh(), new Transformer(), $message);
} else {
$message = trans('messages.warning.disabled', ['name' => $tax->name, 'text' => implode(', ', $relationships)]);
$this->response->errorUnauthorized($message);
} }
} }
} }
public function delete($request)
{
$this->destroy($request);
}
public function destroy($request) public function destroy($request)
{ {
$selected = $request->get('selected', []); $taxes = $this->getSelectedRecords($request);
$taxes = $this->model::find($selected);
foreach ($taxes as $tax) { foreach ($taxes as $tax) {
if (!$relationships = $this->getRelationships($tax)) { try {
$tax->delete(); $this->dispatch(new DeleteTax($tax));
} catch (\Exception $e) {
$message = trans('messages.success.deleted', ['type' => $tax->name]); flash($e->getMessage())->error();
flash($message)->success();
} else {
$message = trans('messages.warning.deleted', ['name' => $tax->name, 'text' => implode(', ', $relationships)]);
$this->response->errorUnauthorized($message);
} }
} }
} }
protected function getRelationships($tax)
{
$relationships = $this->countRelationships($tax, [
'items' => 'items',
'invoice_items' => 'invoices',
'bill_items' => 'bills',
]);
return $relationships;
}
} }

View File

@ -3,6 +3,7 @@
namespace App\Jobs\Common; namespace App\Jobs\Common;
use App\Abstracts\Job; use App\Abstracts\Job;
use App\Models\Auth\User;
use App\Models\Common\Contact; use App\Models\Common\Contact;
class UpdateContact extends Job class UpdateContact extends Job

View File

@ -2,9 +2,8 @@
return [ return [
'select_to_action' => 'Select To Action',
'selected' => 'selected',
'bulk_actions' => 'Bulk Action|Bulk Actions', 'bulk_actions' => 'Bulk Action|Bulk Actions',
'selected' => 'selected',
'delete' => 'Delete', 'delete' => 'Delete',
'duplicate' => 'Duplicate', 'duplicate' => 'Duplicate',
'export' => 'Export', 'export' => 'Export',
@ -40,12 +39,15 @@ return [
], ],
'message' => [ 'message' => [
'sure' => 'Are you sure?', 'sure' => 'Are you sure?',
'duplicate' => 'Do you really want to duplicate these record?', 'duplicate' => 'Do you really want to duplicate these record?',
'deletes' => 'Do you really want to delete these record?|Do you really want to delete these records?', 'delete' => 'Do you really want to delete this record?|Do you really want to delete these records?',
'exports' => 'Do you really want to export these record?|Do you really want to export these records?', 'export' => 'Do you really want to export this record?|Do you really want to export these records?',
'enable' => 'Do you really want to enable these record?|Do you really want to enable these records?', 'enable' => 'Do you really want to enable this record?|Do you really want to enable these records?',
'disable' => 'Do your really want to disable these record?|Do your really want to disable these records?', 'disable' => 'Do you really want to disable this record?|Do you really want to disable these records?',
] 'paid' => 'Do you really want to mark this invoice as paid?|Do you really want to mark these invoices as paid?',
'sent' => 'Do you really want to mark this invoice as sent?|Do you really want to mark these invoices as sent?',
'received' => 'Do you really want to mark this bill as received?|Do you really want to mark these bills as received?',
],
]; ];