akaunting 3.0 (the last dance)

This commit is contained in:
Burak Civan
2022-06-01 10:15:55 +03:00
parent cead09f6d4
commit d9c0764572
3812 changed files with 126831 additions and 102949 deletions

View File

@ -1,81 +0,0 @@
<?php
namespace App\Http\Controllers\Api\Auth;
use App\Abstracts\Http\ApiController;
use App\Http\Requests\Auth\Permission as Request;
use App\Models\Auth\Permission;
use App\Jobs\Auth\CreatePermission;
use App\Jobs\Auth\DeletePermission;
use App\Jobs\Auth\UpdatePermission;
use App\Transformers\Auth\Permission as Transformer;
class Permissions extends ApiController
{
/**
* Display a listing of the resource.
*
* @return \Dingo\Api\Http\Response
*/
public function index()
{
$permissions = Permission::collect();
return $this->response->paginator($permissions, new Transformer());
}
/**
* Display the specified resource.
*
* @param Permission $permission
* @return \Dingo\Api\Http\Response
*/
public function show(Permission $permission)
{
return $this->item($permission, new Transformer());
}
/**
* Store a newly created resource in storage.
*
* @param $request
* @return \Dingo\Api\Http\Response
*/
public function store(Request $request)
{
$permission = $this->dispatch(new CreatePermission($request));
return $this->response->created(route('api.permissions.show', $permission->id), $this->item($permission, new Transformer()));
}
/**
* Update the specified resource in storage.
*
* @param $permission
* @param $request
* @return \Dingo\Api\Http\Response
*/
public function update(Permission $permission, Request $request)
{
$permission = $this->dispatch(new UpdatePermission($permission, $request));
return $this->item($permission->fresh(), new Transformer());
}
/**
* Remove the specified resource from storage.
*
* @param Permission $permission
* @return \Dingo\Api\Http\Response
*/
public function destroy(Permission $permission)
{
try {
$this->dispatch(new DeletePermission($permission));
return $this->response->noContent();
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
}
}
}

View File

@ -1,81 +0,0 @@
<?php
namespace App\Http\Controllers\Api\Auth;
use App\Abstracts\Http\ApiController;
use App\Http\Requests\Auth\Role as Request;
use App\Models\Auth\Role;
use App\Jobs\Auth\CreateRole;
use App\Jobs\Auth\DeleteRole;
use App\Jobs\Auth\UpdateRole;
use App\Transformers\Auth\Role as Transformer;
class Roles extends ApiController
{
/**
* Display a listing of the resource.
*
* @return \Dingo\Api\Http\Response
*/
public function index()
{
$roles = Role::with('permissions')->collect();
return $this->response->paginator($roles, new Transformer());
}
/**
* Display the specified resource.
*
* @param Role $role
* @return \Dingo\Api\Http\Response
*/
public function show(Role $role)
{
return $this->item($role, new Transformer());
}
/**
* Store a newly created resource in storage.
*
* @param $request
* @return \Dingo\Api\Http\Response
*/
public function store(Request $request)
{
$role = $this->dispatch(new CreateRole($request));
return $this->response->created(route('api.roles.show', $role->id), $this->item($role, new Transformer()));
}
/**
* Update the specified resource in storage.
*
* @param $role
* @param $request
* @return \Dingo\Api\Http\Response
*/
public function update(Role $role, Request $request)
{
$role = $this->dispatch(new UpdateRole($role, $request));
return $this->item($role->fresh(), new Transformer());
}
/**
* Remove the specified resource from storage.
*
* @param Role $role
* @return \Dingo\Api\Http\Response
*/
public function destroy(Role $role)
{
try {
$this->dispatch(new DeleteRole($role));
return $this->response->noContent();
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
}
}
}

View File

@ -4,31 +4,32 @@ namespace App\Http\Controllers\Api\Auth;
use App\Abstracts\Http\ApiController;
use App\Http\Requests\Auth\User as Request;
use App\Http\Resources\Auth\User as Resource;
use App\Jobs\Auth\CreateUser;
use App\Jobs\Auth\DeleteUser;
use App\Jobs\Auth\UpdateUser;
use App\Models\Auth\User;
use App\Transformers\Auth\User as Transformer;
class Users extends ApiController
{
/**
* Display a listing of the resource.
*
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function index()
{
$users = User::with('companies', 'permissions', 'roles')->collect();
return $this->response->paginator($users, new Transformer());
return Resource::collection($users);
}
/**
* Display the specified resource.
*
* @param int|string $id
* @return \Dingo\Api\Http\Response
*
* @return \Illuminate\Http\JsonResponse
*/
public function show($id)
{
@ -39,20 +40,21 @@ class Users extends ApiController
$user = User::with('companies', 'permissions', 'roles')->where('email', $id)->first();
}
return $this->item($user, new Transformer());
return new Resource($user);
}
/**
* Store a newly created resource in storage.
*
* @param $request
* @return \Dingo\Api\Http\Response
*
* @return \Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$user = $this->dispatch(new CreateUser($request));
return $this->response->created(route('api.users.show', $user->id), $this->item($user, new Transformer()));
return $this->created(route('api.users.show', $user->id), new Resource($user));
}
/**
@ -60,55 +62,60 @@ class Users extends ApiController
*
* @param $user
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function update(User $user, Request $request)
{
$user = $this->dispatch(new UpdateUser($user, $request));
return $this->item($user->fresh(), new Transformer());
return new Resource($user->fresh());
}
/**
* Enable the specified resource in storage.
*
* @param User $user
* @return \Dingo\Api\Http\Response
*
* @return \Illuminate\Http\JsonResponse
*/
public function enable(User $user)
{
$user = $this->dispatch(new UpdateUser($user, request()->merge(['enabled' => 1])));
return $this->item($user->fresh(), new Transformer());
return new Resource($user->fresh());
}
/**
* Disable the specified resource in storage.
*
* @param User $user
* @return \Dingo\Api\Http\Response
*
* @return \Illuminate\Http\JsonResponse
*/
public function disable(User $user)
{
$user = $this->dispatch(new UpdateUser($user, request()->merge(['enabled' => 0])));
return $this->item($user->fresh(), new Transformer());
return new Resource($user->fresh());
}
/**
* Remove the specified resource from storage.
*
* @param User $user
* @return \Dingo\Api\Http\Response
*
* @throws \Symfony\Component\HttpKernel\Exception\HttpException
*
* @return \Illuminate\Http\Response
*/
public function destroy(User $user)
{
try {
$this->dispatch(new DeleteUser($user));
return $this->response->noContent();
return $this->noContent();
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
}

View File

@ -4,31 +4,31 @@ namespace App\Http\Controllers\Api\Banking;
use App\Abstracts\Http\ApiController;
use App\Http\Requests\Banking\Account as Request;
use App\Http\Resources\Banking\Account as Resource;
use App\Jobs\Banking\CreateAccount;
use App\Jobs\Banking\DeleteAccount;
use App\Jobs\Banking\UpdateAccount;
use App\Models\Banking\Account;
use App\Transformers\Banking\Account as Transformer;
class Accounts extends ApiController
{
/**
* Display a listing of the resource.
*
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function index()
{
$accounts = Account::collect();
return $this->response->paginator($accounts, new Transformer());
return Resource::collection($accounts);
}
/**
* Display the specified resource.
*
* @param $id
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function show($id)
{
@ -39,20 +39,20 @@ class Accounts extends ApiController
$account = Account::where('number', $id)->first();
}
return $this->item($account, new Transformer());
return new Resource($account);
}
/**
* Store a newly created resource in storage.
*
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$account = $this->dispatch(new CreateAccount($request));
return $this->response->created(route('api.accounts.show', $account->id), $this->item($account, new Transformer()));
return $this->created(route('api.accounts.show', $account->id), new Resource($account));
}
/**
@ -60,16 +60,16 @@ class Accounts extends ApiController
*
* @param $account
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function update(Account $account, Request $request)
{
try {
$account = $this->dispatch(new UpdateAccount($account, $request));
return $this->item($account->fresh(), new Transformer());
return new Resource($account->fresh());
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
@ -77,29 +77,29 @@ class Accounts extends ApiController
* Enable the specified resource in storage.
*
* @param Account $account
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function enable(Account $account)
{
$account = $this->dispatch(new UpdateAccount($account, request()->merge(['enabled' => 1])));
return $this->item($account->fresh(), new Transformer());
return new Resource($account->fresh());
}
/**
* Disable the specified resource in storage.
*
* @param Account $account
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function disable(Account $account)
{
try {
$account = $this->dispatch(new UpdateAccount($account, request()->merge(['enabled' => 0])));
return $this->item($account->fresh(), new Transformer());
return new Resource($account->fresh());
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
@ -107,16 +107,16 @@ class Accounts extends ApiController
* Remove the specified resource from storage.
*
* @param Account $account
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\Response
*/
public function destroy(Account $account)
{
try {
$this->dispatch(new DeleteAccount($account));
return $this->response->noContent();
return $this->noContent();
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
}

View File

@ -4,48 +4,48 @@ namespace App\Http\Controllers\Api\Banking;
use App\Abstracts\Http\ApiController;
use App\Http\Requests\Banking\Reconciliation as Request;
use App\Http\Resources\Banking\Reconciliation as Resource;
use App\Jobs\Banking\CreateReconciliation;
use App\Jobs\Banking\DeleteReconciliation;
use App\Jobs\Banking\UpdateReconciliation;
use App\Models\Banking\Reconciliation;
use App\Transformers\Banking\Reconciliation as Transformer;
class Reconciliations extends ApiController
{
/**
* Display a listing of the resource.
*
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function index()
{
$items = Reconciliation::with('account')->collect();
$reconciliations = Reconciliation::with('account')->collect();
return $this->response->paginator($items, new Transformer());
return Resource::collection($reconciliations);
}
/**
* Display the specified resource.
*
* @param $reconciliation
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function show(Reconciliation $reconciliation)
{
return $this->item($reconciliation, new Transformer());
return new Resource($reconciliation);
}
/**
* Store a newly created resource in storage.
*
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$reconciliation = $this->dispatch(new CreateReconciliation($request));
return $this->response->created(route('api.reconciliations.show', $reconciliation->id), $this->item($reconciliation, new Transformer()));
return $this->created(route('api.reconciliations.show', $reconciliation->id), new Resource($reconciliation));
}
/**
@ -53,29 +53,29 @@ class Reconciliations extends ApiController
*
* @param $reconciliation
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function update(Reconciliation $reconciliation, Request $request)
{
$reconciliation = $this->dispatch(new UpdateReconciliation($reconciliation, $request));
return $this->item($reconciliation->fresh(), new Transformer());
return new Resource($reconciliation->fresh());
}
/**
* Remove the specified resource from storage.
*
* @param Reconciliation $reconciliation
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\Response
*/
public function destroy(Reconciliation $reconciliation)
{
try {
$this->dispatch(new DeleteReconciliation($reconciliation));
return $this->response->noContent();
return $this->noContent();
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
}

View File

@ -4,48 +4,48 @@ namespace App\Http\Controllers\Api\Banking;
use App\Abstracts\Http\ApiController;
use App\Http\Requests\Banking\Transaction as Request;
use App\Http\Resources\Banking\Transaction as Resource;
use App\Jobs\Banking\CreateTransaction;
use App\Jobs\Banking\DeleteTransaction;
use App\Jobs\Banking\UpdateTransaction;
use App\Models\Banking\Transaction;
use App\Transformers\Banking\Transaction as Transformer;
class Transactions extends ApiController
{
/**
* Display a listing of the resource.
*
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function index()
{
$transactions = Transaction::with('account', 'category', 'contact')->collect(['paid_at'=> 'desc']);
return $this->response->paginator($transactions, new Transformer());
return Resource::collection($transactions);
}
/**
* Display the specified resource.
*
* @param Transaction $transaction
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function show(Transaction $transaction)
{
return $this->item($transaction, new Transformer());
return new Resource($transaction);
}
/**
* Store a newly created resource in storage.
*
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$transaction = $this->dispatch(new CreateTransaction($request));
return $this->response->created(route('api.transactions.show', $transaction->id), $this->item($transaction, new Transformer()));
return $this->created(route('api.transactions.show', $transaction->id), new Resource($transaction));
}
/**
@ -53,29 +53,29 @@ class Transactions extends ApiController
*
* @param $transaction
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function update(Transaction $transaction, Request $request)
{
$transaction = $this->dispatch(new UpdateTransaction($transaction, $request));
return $this->item($transaction->fresh(), new Transformer());
return new Resource($transaction->fresh());
}
/**
* Remove the specified resource from storage.
*
* @param Transaction $transaction
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\Response
*/
public function destroy(Transaction $transaction)
{
try {
$this->dispatch(new DeleteTransaction($transaction));
return $this->response->noContent();
return $this->noContent();
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
}

View File

@ -4,18 +4,18 @@ namespace App\Http\Controllers\Api\Banking;
use App\Abstracts\Http\ApiController;
use App\Http\Requests\Banking\Transfer as Request;
use App\Http\Resources\Banking\Transfer as Resource;
use App\Jobs\Banking\CreateTransfer;
use App\Jobs\Banking\UpdateTransfer;
use App\Jobs\Banking\DeleteTransfer;
use App\Models\Banking\Transfer;
use App\Transformers\Banking\Transfer as Transformer;
class Transfers extends ApiController
{
/**
* Display a listing of the resource.
*
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function index()
{
@ -51,31 +51,31 @@ class Transfers extends ApiController
$transfers->setCollection(collect($items));
}
return $this->response->paginator($transfers, new Transformer());
return Resource::collection($transfers);
}
/**
* Display the specified resource.
*
* @param Transfer $transfer
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function show(Transfer $transfer)
{
return $this->item($transfer, new Transformer());
return new Resource($transfer);
}
/**
* Store a newly created resource in storage.
*
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$transfer = $this->dispatch(new CreateTransfer($request));
return $this->response->created(route('api.transfers.show', $transfer->id), $this->item($transfer, new Transformer()));
return $this->created(route('api.transfers.show', $transfer->id), new Resource($transfer));
}
/**
@ -83,29 +83,29 @@ class Transfers extends ApiController
*
* @param $transfer
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function update(Transfer $transfer, Request $request)
{
$transfer = $this->dispatch(new UpdateTransfer($transfer, $request));
return $this->item($transfer->fresh(), new Transformer());
return new Resource($transfer->fresh());
}
/**
* Remove the specified resource from storage.
*
* @param Transfer $transfer
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\Response
*/
public function destroy(Transfer $transfer)
{
try {
$this->dispatch(new DeleteTransfer($transfer));
return $this->response->noContent();
return $this->noContent();
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
}

View File

@ -4,13 +4,13 @@ namespace App\Http\Controllers\Api\Common;
use App\Abstracts\Http\ApiController;
use App\Http\Requests\Common\Company as Request;
use App\Http\Resources\Common\Company as Resource;
use App\Jobs\Common\CreateCompany;
use App\Jobs\Common\DeleteCompany;
use App\Jobs\Common\UpdateCompany;
use App\Models\Common\Company;
use App\Transformers\Common\Company as Transformer;
use App\Traits\Users;
use Dingo\Api\Http\Response;
use Illuminate\Http\Response;
class Companies extends ApiController
{
@ -19,20 +19,20 @@ class Companies extends ApiController
/**
* Display a listing of the resource.
*
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function index()
{
$companies = user()->companies()->collect();
return $this->response->paginator($companies, new Transformer());
return Resource::collection($companies);
}
/**
* Display the specified resource.
*
* @param Company $company
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function show(Company $company)
{
@ -40,9 +40,9 @@ class Companies extends ApiController
// Check if user can access company
$this->canAccess($company);
return $this->item($company, new Transformer());
return new Resource($company);
} catch (\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
@ -50,13 +50,13 @@ class Companies extends ApiController
* Store a newly created resource in storage.
*
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$company = $this->dispatch(new CreateCompany($request));
return $this->response->created(route('api.companies.show', $company->id), $this->item($company, new Transformer()));
return $this->created(route('api.companies.show', $company->id), new Resource($company));
}
/**
@ -64,16 +64,16 @@ class Companies extends ApiController
*
* @param $company
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function update(Company $company, Request $request)
{
try {
$company = $this->dispatch(new UpdateCompany($company, $request));
return $this->item($company->fresh(), new Transformer());
return new Resource($company->fresh());
} catch (\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
@ -81,16 +81,16 @@ class Companies extends ApiController
* Enable the specified resource in storage.
*
* @param Company $company
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function enable(Company $company)
{
try {
$company = $this->dispatch(new UpdateCompany($company, request()->merge(['enabled' => 1])));
return $this->item($company->fresh(), new Transformer());
return new Resource($company->fresh());
} catch (\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
@ -98,16 +98,16 @@ class Companies extends ApiController
* Disable the specified resource in storage.
*
* @param Company $company
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function disable(Company $company)
{
try {
$company = $this->dispatch(new UpdateCompany($company, request()->merge(['enabled' => 0])));
return $this->item($company->fresh(), new Transformer());
return new Resource($company->fresh());
} catch (\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
@ -115,16 +115,16 @@ class Companies extends ApiController
* Remove the specified resource from storage.
*
* @param Company $company
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\Response
*/
public function destroy(Company $company)
{
try {
$this->dispatch(new DeleteCompany($company));
return $this->response->noContent();
return $this->noContent();
} catch (\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
@ -133,16 +133,16 @@ class Companies extends ApiController
*
* @param Company $company
*
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\Response
*/
public function canAccess(Company $company)
{
if (!empty($company) && $this->isUserCompany($company->id)) {
if (! empty($company) && $this->isUserCompany($company->id)) {
return new Response('');
}
$message = trans('companies.error.not_user_company');
$this->response->errorUnauthorized($message);
$this->errorUnauthorized($message);
}
}

View File

@ -4,12 +4,12 @@ namespace App\Http\Controllers\Api\Common;
use App\Abstracts\Http\ApiController;
use App\Http\Requests\Common\Contact as Request;
use App\Http\Resources\Common\Contact as Resource;
use App\Jobs\Common\CreateContact;
use App\Jobs\Common\DeleteContact;
use App\Jobs\Common\UpdateContact;
use App\Models\Common\Contact;
use App\Traits\Uploads;
use App\Transformers\Common\Contact as Transformer;
class Contacts extends ApiController
{
@ -18,20 +18,20 @@ class Contacts extends ApiController
/**
* Display a listing of the resource.
*
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function index()
{
$contacts = Contact::collect();
return $this->response->paginator($contacts, new Transformer());
return Resource::collection($contacts);
}
/**
* Display the specified resource.
*
* @param int|string $id
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function show($id)
{
@ -42,20 +42,20 @@ class Contacts extends ApiController
$contact = Contact::where('email', $id)->first();
}
return $this->item($contact, new Transformer());
return new Resource($contact);
}
/**
* Store a newly created resource in storage.
*
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$contact = $this->dispatch(new CreateContact($request));
return $this->response->created(route('api.contacts.show', $contact->id), $this->item($contact, new Transformer()));
return $this->created(route('api.contacts.show', $contact->id), new Resource($contact));
}
/**
@ -63,42 +63,42 @@ class Contacts extends ApiController
*
* @param $contact
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function update(Contact $contact, Request $request)
{
$contact = $this->dispatch(new UpdateContact($contact, $request));
return $this->item($contact->fresh(), new Transformer());
return new Resource($contact->fresh());
}
/**
* Enable the specified resource in storage.
*
* @param Contact $contact
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function enable(Contact $contact)
{
$contact = $this->dispatch(new UpdateContact($contact, request()->merge(['enabled' => 1])));
return $this->item($contact->fresh(), new Transformer());
return new Resource($contact->fresh());
}
/**
* Disable the specified resource in storage.
*
* @param Contact $contact
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function disable(Contact $contact)
{
try {
$contact = $this->dispatch(new UpdateContact($contact, request()->merge(['enabled' => 0])));
return $this->item($contact->fresh(), new Transformer());
return new Resource($contact->fresh());
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
@ -106,16 +106,16 @@ class Contacts extends ApiController
* Remove the specified resource from storage.
*
* @param Contact $contact
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\Response
*/
public function destroy(Contact $contact)
{
try {
$this->dispatch(new DeleteContact($contact));
return $this->response->noContent();
return $this->noContent();
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
}

View File

@ -4,13 +4,13 @@ namespace App\Http\Controllers\Api\Common;
use App\Abstracts\Http\ApiController;
use App\Http\Requests\Common\Dashboard as Request;
use App\Http\Resources\Common\Dashboard as Resource;
use App\Jobs\Common\CreateDashboard;
use App\Jobs\Common\DeleteDashboard;
use App\Jobs\Common\UpdateDashboard;
use App\Models\Common\Dashboard;
use App\Transformers\Common\Dashboard as Transformer;
use App\Traits\Users;
use Dingo\Api\Http\Response;
use Illuminate\Http\Response;
class Dashboards extends ApiController
{
@ -19,20 +19,20 @@ class Dashboards extends ApiController
/**
* Display a listing of the resource.
*
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function index()
{
$dashboards = user()->dashboards()->with('widgets')->collect();
return $this->response->paginator($dashboards, new Transformer());
return Resource::collection($dashboards);
}
/**
* Display the specified resource.
*
* @param int|string $id
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function show($id)
{
@ -42,9 +42,9 @@ class Dashboards extends ApiController
// Check if user can access dashboard
$this->canAccess($dashboard);
return $this->item($dashboard, new Transformer());
return new Resource($dashboard);
} catch (\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
@ -52,13 +52,13 @@ class Dashboards extends ApiController
* Store a newly created resource in storage.
*
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$dashboard = $this->dispatch(new CreateDashboard($request));
return $this->response->created(route('api.dashboards.show', $dashboard->id), $this->item($dashboard, new Transformer()));
return $this->created(route('api.dashboards.show', $dashboard->id), new Resource($dashboard));
}
/**
@ -66,16 +66,16 @@ class Dashboards extends ApiController
*
* @param $dashboard
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function update(Dashboard $dashboard, Request $request)
{
try {
$dashboard = $this->dispatch(new UpdateDashboard($dashboard, $request));
return $this->item($dashboard->fresh(), new Transformer());
return new Resource($dashboard->fresh());
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
@ -83,16 +83,16 @@ class Dashboards extends ApiController
* Enable the specified resource in storage.
*
* @param Dashboard $dashboard
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function enable(Dashboard $dashboard)
{
try {
$dashboard = $this->dispatch(new UpdateDashboard($dashboard, request()->merge(['enabled' => 1])));
return $this->item($dashboard->fresh(), new Transformer());
return new Resource($dashboard->fresh());
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
@ -100,16 +100,16 @@ class Dashboards extends ApiController
* Disable the specified resource in storage.
*
* @param Dashboard $dashboard
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function disable(Dashboard $dashboard)
{
try {
$dashboard = $this->dispatch(new UpdateDashboard($dashboard, request()->merge(['enabled' => 0])));
return $this->item($dashboard->fresh(), new Transformer());
return new Resource($dashboard->fresh());
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
@ -117,16 +117,16 @@ class Dashboards extends ApiController
* Remove the specified resource from storage.
*
* @param Dashboard $dashboard
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\Response
*/
public function destroy(Dashboard $dashboard)
{
try {
$this->dispatch(new DeleteDashboard($dashboard));
return $this->response->noContent();
return $this->noContent();
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
@ -135,7 +135,7 @@ class Dashboards extends ApiController
*
* @param Dashboard $dashboard
*
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\Response
*/
public function canAccess($dashboard)
{
@ -145,6 +145,6 @@ class Dashboards extends ApiController
$message = trans('dashboards.error.not_user_dashboard');
$this->response->errorUnauthorized($message);
$this->errorUnauthorized($message);
}
}

View File

@ -4,50 +4,50 @@ namespace App\Http\Controllers\Api\Common;
use App\Abstracts\Http\ApiController;
use App\Http\Requests\Common\Item as Request;
use App\Http\Resources\Common\Item as Resource;
use App\Jobs\Common\CreateItem;
use App\Jobs\Common\DeleteItem;
use App\Jobs\Common\UpdateItem;
use App\Models\Common\Item;
use App\Transformers\Common\Item as Transformer;
class Items extends ApiController
{
/**
* Display a listing of the resource.
*
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function index()
{
$items = Item::with('category', 'taxes')->collect();
return $this->response->paginator($items, new Transformer());
return Resource::collection($items);
}
/**
* Display the specified resource.
*
* @param int|string $id
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function show($id)
{
$item = Item::with('category', 'taxes')->find($id);
return $this->item($item, new Transformer());
return new Resource($item);
}
/**
* Store a newly created resource in storage.
*
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$item = $this->dispatch(new CreateItem($request));
return $this->response->created(route('api.items.show', $item->id), $this->item($item, new Transformer()));
return $this->created(route('api.items.show', $item->id), new Resource($item));
}
/**
@ -55,55 +55,55 @@ class Items extends ApiController
*
* @param $item
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function update(Item $item, Request $request)
{
$item = $this->dispatch(new UpdateItem($item, $request));
return $this->item($item->fresh(), new Transformer());
return new Resource($item->fresh());
}
/**
* Enable the specified resource in storage.
*
* @param Item $item
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function enable(Item $item)
{
$item = $this->dispatch(new UpdateItem($item, request()->merge(['enabled' => 1])));
return $this->item($item->fresh(), new Transformer());
return new Resource($item->fresh());
}
/**
* Disable the specified resource in storage.
*
* @param Item $item
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function disable(Item $item)
{
$item = $this->dispatch(new UpdateItem($item, request()->merge(['enabled' => 0])));
return $this->item($item->fresh(), new Transformer());
return new Resource($item->fresh());
}
/**
* Remove the specified resource from storage.
*
* @param Item $item
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\Response
*/
public function destroy(Item $item)
{
try {
$this->dispatch(new DeleteItem($item));
return $this->response->noContent();
return $this->noContent();
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
}

View File

@ -3,13 +3,10 @@
namespace App\Http\Controllers\Api\Common;
use App\Abstracts\Http\ApiController;
use Date;
use Dingo\Api\Routing\Helpers;
use App\Utilities\Date;
class Ping extends ApiController
{
use Helpers;
/**
* Instantiate a new controller instance.
*/
@ -23,9 +20,9 @@ class Ping extends ApiController
*
* @return \Illuminate\Http\JsonResponse
*/
public function index()
public function pong()
{
return $this->response->array([
return response()->json([
'status' => 'ok',
'timestamp' => Date::now(),
]);

View File

@ -4,48 +4,48 @@ namespace App\Http\Controllers\Api\Common;
use App\Abstracts\Http\ApiController;
use App\Http\Requests\Common\Report as Request;
use App\Http\Resources\Common\Report as Resource;
use App\Jobs\Common\CreateReport;
use App\Jobs\Common\DeleteReport;
use App\Jobs\Common\UpdateReport;
use App\Models\Common\Report;
use App\Transformers\Common\Report as Transformer;
class Reports extends ApiController
{
/**
* Display a listing of the resource.
*
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function index()
{
$reports = Report::collect();
return $this->response->paginator($reports, new Transformer());
return Resource::collection($reports);
}
/**
* Display the specified resource.
*
* @param Report $report
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function show(Report $report)
{
return $this->item($report, new Transformer());
return new Resource($report);
}
/**
* Store a newly created resource in storage.
*
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$report = $this->dispatch(new CreateReport($request));
return $this->response->created(route('api.reports.show', $report->id), $this->item($report, new Transformer()));
return $this->created(route('api.reports.show', $report->id), new Resource($report));
}
/**
@ -53,29 +53,29 @@ class Reports extends ApiController
*
* @param $report
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function update(Report $report, Request $request)
{
$report = $this->dispatch(new UpdateReport($report, $request));
return $this->item($report->fresh(), new Transformer());
return new Resource($report->fresh());
}
/**
* Remove the specified resource from storage.
*
* @param Report $report
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\Response
*/
public function destroy(Report $report)
{
try {
$this->dispatch(new DeleteReport($report));
return $this->response->noContent();
return $this->noContent();
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
}

View File

@ -4,7 +4,6 @@ namespace App\Http\Controllers\Api\Common;
use App\Abstracts\Http\ApiController;
use App\Models\Module\Module;
use Dingo\Api\Http\Response;
use Illuminate\Filesystem\Filesystem;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Str;
@ -16,7 +15,7 @@ class Translations extends ApiController
*
* @param string $locale
* @param string $file
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function file($locale, $file)
{
@ -34,7 +33,7 @@ class Translations extends ApiController
* Display the specified resource.
*
* @param string $locale
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function all($locale)
{

View File

@ -4,11 +4,11 @@ namespace App\Http\Controllers\Api\Document;
use App\Abstracts\Http\ApiController;
use App\Http\Requests\Banking\Transaction as Request;
use App\Http\Resources\Banking\Transaction as Resource;
use App\Jobs\Banking\CreateBankingDocumentTransaction;
use App\Jobs\Banking\DeleteTransaction;
use App\Models\Banking\Transaction;
use App\Models\Document\Document;
use App\Transformers\Banking\Transaction as Transformer;
class DocumentTransactions extends ApiController
{
@ -28,13 +28,13 @@ class DocumentTransactions extends ApiController
* Display a listing of the resource.
*
* @param $document_id
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function index($document_id)
{
$transactions = Transaction::documentId($document_id)->get();
return $this->response->collection($transactions, new Transformer());
return Resource::collection($transactions);
}
/**
@ -42,13 +42,13 @@ class DocumentTransactions extends ApiController
*
* @param $document_id
* @param $id
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function show($document_id, $id)
{
$transaction = Transaction::documentId($document_id)->find($id);
return $this->item($transaction, new Transformer());
return new Resource($transaction);
}
/**
@ -56,7 +56,7 @@ class DocumentTransactions extends ApiController
*
* @param $document_id
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function store($document_id, Request $request)
{
@ -64,7 +64,7 @@ class DocumentTransactions extends ApiController
$transaction = $this->dispatch(new CreateBankingDocumentTransaction($document, $request));
return $this->response->created(route('api.documents.transactions.show', [$document_id, $transaction->id]), $this->item($transaction, new Transformer()));
return $this->created(route('api.documents.transactions.show', [$document_id, $transaction->id]), new Resource($transaction));
}
/**
@ -72,7 +72,7 @@ class DocumentTransactions extends ApiController
*
* @param $document_id
* @param $id
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\Response
*/
public function destroy($document_id, $id)
{
@ -80,6 +80,6 @@ class DocumentTransactions extends ApiController
$this->dispatch(new DeleteTransaction($transaction));
return $this->response->noContent();
return $this->noContent();
}
}

View File

@ -4,31 +4,31 @@ namespace App\Http\Controllers\Api\Document;
use App\Abstracts\Http\ApiController;
use App\Http\Requests\Document\Document as Request;
use App\Http\Resources\Document\Document as Resource;
use App\Jobs\Document\CreateDocument;
use App\Jobs\Document\DeleteDocument;
use App\Jobs\Document\UpdateDocument;
use App\Models\Document\Document;
use App\Transformers\Document\Document as Transformer;
class Documents extends ApiController
{
/**
* Display a listing of the resource.
*
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function index()
{
$documents = Document::with('contact', 'histories', 'items', 'transactions')->collect(['issued_at'=> 'desc']);
return $this->response->paginator($documents, new Transformer());
return Resource::collection($documents);
}
/**
* Display the specified resource.
*
* @param $id
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function show($id)
{
@ -39,7 +39,7 @@ class Documents extends ApiController
$document = Document::where('document_number', $id)->first();
}
return $this->item($document, new Transformer());
return new Resource($document);
}
/**
@ -47,13 +47,13 @@ class Documents extends ApiController
*
* @param $request
*
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$document = $this->dispatch(new CreateDocument($request));
return $this->response->created(route('api.documents.show', $document->id), $this->item($document, new Transformer()));
return $this->created(route('api.documents.show', $document->id), new Resource($document));
}
/**
@ -62,13 +62,13 @@ class Documents extends ApiController
* @param $document
* @param $request
*
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function update(Document $document, Request $request)
{
$document = $this->dispatch(new UpdateDocument($document, $request));
return $this->item($document->fresh(), new Transformer());
return new Resource($document->fresh());
}
/**
@ -76,16 +76,16 @@ class Documents extends ApiController
*
* @param Document $document
*
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\Response
*/
public function destroy(Document $document)
{
try {
$this->dispatch(new DeleteDocument($document));
return $this->response->noContent();
return $this->noContent();
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
}

View File

@ -4,48 +4,48 @@ namespace App\Http\Controllers\Api\Settings;
use App\Abstracts\Http\ApiController;
use App\Http\Requests\Setting\Category as Request;
use App\Http\Resources\Setting\Category as Resource;
use App\Jobs\Setting\CreateCategory;
use App\Jobs\Setting\DeleteCategory;
use App\Jobs\Setting\UpdateCategory;
use App\Models\Setting\Category;
use App\Transformers\Setting\Category as Transformer;
class Categories extends ApiController
{
/**
* Display a listing of the resource.
*
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function index()
{
$categories = Category::collect();
$categories = Category::withSubCategory()->collect();
return $this->response->paginator($categories, new Transformer());
return Resource::collection($categories);
}
/**
* Display the specified resource.
*
* @param Category $category
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function show(Category $category)
{
return $this->item($category, new Transformer());
return new Resource($category);
}
/**
* Store a newly created resource in storage.
*
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$category = $this->dispatch(new CreateCategory($request));
return $this->response->created(route('api.categories.show', $category->id), $this->item($category, new Transformer()));
return $this->created(route('api.categories.show', $category->id), new Resource($category));
}
/**
@ -53,16 +53,16 @@ class Categories extends ApiController
*
* @param $category
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function update(Category $category, Request $request)
{
try {
$category = $this->dispatch(new UpdateCategory($category, $request));
return $this->item($category->fresh(), new Transformer());
return new Resource($category->fresh());
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
@ -70,29 +70,29 @@ class Categories extends ApiController
* Enable the specified resource in storage.
*
* @param Category $category
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function enable(Category $category)
{
$category = $this->dispatch(new UpdateCategory($category, request()->merge(['enabled' => 1])));
return $this->item($category->fresh(), new Transformer());
return new Resource($category->fresh());
}
/**
* Disable the specified resource in storage.
*
* @param Category $category
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function disable(Category $category)
{
try {
$category = $this->dispatch(new UpdateCategory($category, request()->merge(['enabled' => 0])));
return $this->item($category->fresh(), new Transformer());
return new Resource($category->fresh());
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
@ -100,16 +100,16 @@ class Categories extends ApiController
* Remove the specified resource from storage.
*
* @param Category $category
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\Response
*/
public function destroy(Category $category)
{
try {
$this->dispatch(new DeleteCategory($category));
return $this->response->noContent();
return $this->noContent();
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
}

View File

@ -4,31 +4,31 @@ namespace App\Http\Controllers\Api\Settings;
use App\Abstracts\Http\ApiController;
use App\Http\Requests\Setting\Currency as Request;
use App\Http\Resources\Setting\Currency as Resource;
use App\Jobs\Setting\CreateCurrency;
use App\Jobs\Setting\DeleteCurrency;
use App\Jobs\Setting\UpdateCurrency;
use App\Models\Setting\Currency;
use App\Transformers\Setting\Currency as Transformer;
class Currencies extends ApiController
{
/**
* Display a listing of the resource.
*
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function index()
{
$currencies = Currency::collect();
return $this->response->paginator($currencies, new Transformer());
return Resource::collection($currencies);
}
/**
* Display the specified resource.
*
* @param int|string $id
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function show($id)
{
@ -39,20 +39,20 @@ class Currencies extends ApiController
$currency = Currency::where('code', $id)->first();
}
return $this->item($currency, new Transformer());
return new Resource($currency);
}
/**
* Store a newly created resource in storage.
*
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$currency = $this->dispatch(new CreateCurrency($request));
return $this->response->created(route('api.currencies.show', $currency->id), $this->item($currency, new Transformer()));
return $this->created(route('api.currencies.show', $currency->id), new Resource($currency));
}
/**
@ -60,16 +60,16 @@ class Currencies extends ApiController
*
* @param $currency
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function update(Currency $currency, Request $request)
{
try {
$currency = $this->dispatch(new UpdateCurrency($currency, $request));
return $this->item($currency->fresh(), new Transformer());
return new Resource($currency->fresh());
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
@ -77,29 +77,29 @@ class Currencies extends ApiController
* Enable the specified resource in storage.
*
* @param Currency $currency
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function enable(Currency $currency)
{
$currency = $this->dispatch(new UpdateCurrency($currency, request()->merge(['enabled' => 1])));
return $this->item($currency->fresh(), new Transformer());
return new Resource($currency->fresh());
}
/**
* Disable the specified resource in storage.
*
* @param Currency $currency
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function disable(Currency $currency)
{
try {
$currency = $this->dispatch(new UpdateCurrency($currency, request()->merge(['enabled' => 0])));
return $this->item($currency->fresh(), new Transformer());
return new Resource($currency->fresh());
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
@ -107,16 +107,16 @@ class Currencies extends ApiController
* Remove the specified resource from storage.
*
* @param Currency $currency
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\Response
*/
public function destroy(Currency $currency)
{
try {
$this->dispatch(new DeleteCurrency($currency));
return $this->response->noContent();
return $this->noContent();
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
}

View File

@ -4,14 +4,11 @@ namespace App\Http\Controllers\Api\Settings;
use App\Abstracts\Http\ApiController;
use App\Http\Requests\Setting\Setting as Request;
use App\Http\Resources\Setting\Setting as Resource;
use App\Models\Setting\Setting;
use App\Transformers\Setting\Setting as Transformer;
use Dingo\Api\Routing\Helpers;
class Settings extends ApiController
{
use Helpers;
/**
* Instantiate a new controller instance.
*/
@ -26,20 +23,20 @@ class Settings extends ApiController
/**
* Display a listing of the resource.
*
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function index()
{
$settings = Setting::all();
return $this->response->collection($settings, new Transformer());
return Resource::collection($settings);
}
/**
* Display the specified resource.
*
* @param int|string $id
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function show($id)
{
@ -50,20 +47,20 @@ class Settings extends ApiController
$setting = Setting::where('key', $id)->first();
}
return $this->item($setting, new Transformer());
return new Resource($setting);
}
/**
* Store a newly created resource in storage.
*
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$setting = Setting::create($request->all());
return $this->response->created(route('api.settings.show', $setting->id), $this->item($setting, new Transformer()));
return $this->created(route('api.settings.show', $setting->id), new Resource($setting));
}
/**
@ -71,25 +68,25 @@ class Settings extends ApiController
*
* @param $setting
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function update(Setting $setting, Request $request)
{
$setting->update($request->all());
return $this->item($setting->fresh(), new Transformer());
return new Resource($setting->fresh());
}
/**
* Remove the specified resource from storage.
*
* @param Setting $setting
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\Response
*/
public function destroy(Setting $setting)
{
$setting->delete();
return $this->response->noContent();
return $this->noContent();
}
}

View File

@ -4,48 +4,48 @@ namespace App\Http\Controllers\Api\Settings;
use App\Abstracts\Http\ApiController;
use App\Http\Requests\Setting\Tax as Request;
use App\Http\Resources\Setting\Tax as Resource;
use App\Jobs\Setting\CreateTax;
use App\Jobs\Setting\DeleteTax;
use App\Jobs\Setting\UpdateTax;
use App\Models\Setting\Tax;
use App\Transformers\Setting\Tax as Transformer;
class Taxes extends ApiController
{
/**
* Display a listing of the resource.
*
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function index()
{
$taxes = Tax::collect();
return $this->response->paginator($taxes, new Transformer());
return Resource::collection($taxes);
}
/**
* Display the specified resource.
*
* @param Tax $tax
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function show(Tax $tax)
{
return $this->item($tax, new Transformer());
return new Resource($tax);
}
/**
* Store a newly created resource in storage.
*
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function store(Request $request)
{
$tax = $this->dispatch(new CreateTax($request));
return $this->response->created(route('api.taxes.show', $tax->id), $this->item($tax, new Transformer()));
return $this->created(route('api.taxes.show', $tax->id), new Resource($tax));
}
/**
@ -53,16 +53,16 @@ class Taxes extends ApiController
*
* @param $tax
* @param $request
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function update(Tax $tax, Request $request)
{
try {
$tax = $this->dispatch(new UpdateTax($tax, $request));
return $this->item($tax->fresh(), new Transformer());
return new Resource($tax->fresh());
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
@ -70,29 +70,29 @@ class Taxes extends ApiController
* Enable the specified resource in storage.
*
* @param Tax $tax
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function enable(Tax $tax)
{
$tax = $this->dispatch(new UpdateTax($tax, request()->merge(['enabled' => 1])));
return $this->item($tax->fresh(), new Transformer());
return new Resource($tax->fresh());
}
/**
* Disable the specified resource in storage.
*
* @param Tax $tax
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\JsonResponse
*/
public function disable(Tax $tax)
{
try {
$tax = $this->dispatch(new UpdateTax($tax, request()->merge(['enabled' => 0])));
return $this->item($tax->fresh(), new Transformer());
return new Resource($tax->fresh());
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
@ -100,16 +100,16 @@ class Taxes extends ApiController
* Remove the specified resource from storage.
*
* @param Tax $tax
* @return \Dingo\Api\Http\Response
* @return \Illuminate\Http\Response
*/
public function destroy(Tax $tax)
{
try {
$this->dispatch(new DeleteTax($tax));
return $this->response->noContent();
return $this->noContent();
} catch(\Exception $e) {
$this->response->errorUnauthorized($e->getMessage());
$this->errorUnauthorized($e->getMessage());
}
}
}

View File

@ -36,7 +36,7 @@ class Login extends Controller
public function store(Request $request)
{
// Attempt to login
if (!auth()->attempt($request->only('email', 'password'), $request->get('remember', false))) {
if (! auth()->attempt($request->only('email', 'password'), $request->get('remember', false))) {
return response()->json([
'status' => null,
'success' => false,
@ -51,7 +51,7 @@ class Login extends Controller
$user = user();
// Check if user is enabled
if (!$user->enabled) {
if (! $user->enabled) {
$this->logout();
return response()->json([
@ -69,7 +69,7 @@ class Login extends Controller
});
// Logout if no company assigned
if (!$company) {
if (! $company) {
$this->logout();
return response()->json([
@ -95,7 +95,7 @@ class Login extends Controller
'status' => null,
'success' => true,
'error' => false,
'message' => null,
'message' => trans('auth.login_redirect'),
'data' => null,
'redirect' => url($path),
]);
@ -108,7 +108,7 @@ class Login extends Controller
'status' => null,
'success' => true,
'error' => false,
'message' => null,
'message' => trans('auth.login_redirect'),
'data' => null,
'redirect' => redirect()->intended($url)->getTargetUrl(),
]);
@ -128,6 +128,9 @@ class Login extends Controller
// Session destroy is required if stored in database
if (config('session.driver') == 'database') {
$request = app('Illuminate\Http\Request');
$request->session()->invalidate();
$request->session()->regenerateToken();
$request->session()->getHandler()->destroy($request->session()->getId());
}
}

View File

@ -1,130 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Abstracts\Http\Controller;
use App\Http\Requests\Auth\Permission as Request;
use App\Jobs\Auth\CreatePermission;
use App\Jobs\Auth\DeletePermission;
use App\Jobs\Auth\UpdatePermission;
use App\Models\Auth\Permission;
class Permissions extends Controller
{
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
$permissions = Permission::collect();
return $this->response('auth.permissions.index', compact('permissions'));
}
/**
* Show the form for creating a new resource.
*
* @return Response
*/
public function create()
{
return view('auth.permissions.create');
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
*
* @return Response
*/
public function store(Request $request)
{
$response = $this->ajaxDispatch(new CreatePermission($request));
if ($response['success']) {
$response['redirect'] = route('permissions.index');
$message = trans('messages.success.added', ['type' => trans_choice('general.permissions', 1)]);
flash($message)->success();
} else {
$response['redirect'] = route('permissions.create');
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
/**
* Show the form for editing the specified resource.
*
* @param Permission $permission
*
* @return Response
*/
public function edit(Permission $permission)
{
return view('auth.permissions.edit', compact('permission'));
}
/**
* Update the specified resource in storage.
*
* @param Permission $permission
* @param Request $request
*
* @return Response
*/
public function update(Permission $permission, Request $request)
{
$response = $this->ajaxDispatch(new UpdatePermission($permission, $request));
if ($response['success']) {
$response['redirect'] = route('permissions.index');
$message = trans('messages.success.updated', ['type' => $permission->display_name]);
flash($message)->success();
} else {
$response['redirect'] = route('permissions.edit', $permission->id);
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
/**
* Remove the specified resource from storage.
*
* @param Permission $permission
*
* @return Response
*/
public function destroy(Permission $permission)
{
$response = $this->ajaxDispatch(new DeletePermission($permission));
$response['redirect'] = route('permissions.index');
if ($response['success']) {
$message = trans('messages.success.deleted', ['type' => $permission->display_name]);
flash($message)->success();
} else {
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
}

View File

@ -0,0 +1,84 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Abstracts\Http\Controller;
use App\Http\Requests\Auth\Register as Request;
use App\Jobs\Auth\DeleteInvitation;
use App\Models\Auth\UserInvitation;
use Illuminate\Auth\Events\Registered;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Str;
class Register extends Controller
{
use RegistersUsers;
/**
* Where to redirect users after registration.
*
* @var string
*/
protected $redirectTo = '/';
/**
* Create a new controller instance.
*
* @return void
*/
public function __construct()
{
$this->middleware('guest');
}
public function create($token)
{
$invitation = UserInvitation::token($token)->first();
if ($invitation) {
return view('auth.register.create', ['token' => $token]);
}
abort(403);
}
public function store(Request $request)
{
$invitation = UserInvitation::token($request->get('token'))->first();
$user = $invitation->user;
$this->dispatch(new DeleteInvitation($invitation));
event(new Registered($user));
if ($response = $this->registered($request, $user)) {
return $response;
}
}
/**
* The user has been registered.
*
* @param \Illuminate\Http\Request $request
* @param mixed $user
* @return mixed
*/
protected function registered(Request $request, $user)
{
$user->forceFill([
'password' => $request->password,
'remember_token' => Str::random(60),
])->save();
$this->guard()->login($user);
$message = trans('messages.success.connected', ['type' => trans_choice('general.users', 1)]);
flash($message)->success();
return response()->json([
'redirect' => url($this->redirectPath()),
]);
}
}

View File

@ -90,7 +90,7 @@ class Reset extends Controller
});
// Logout if no company assigned
if (!$company) {
if (! $company) {
$this->guard()->logout();
return response()->json([

View File

@ -1,155 +0,0 @@
<?php
namespace App\Http\Controllers\Auth;
use App\Abstracts\Http\Controller;
use App\Http\Requests\Auth\Role as Request;
use App\Jobs\Auth\CreateRole;
use App\Jobs\Auth\DeleteRole;
use App\Jobs\Auth\UpdateRole;
use App\Models\Auth\Permission;
use App\Models\Auth\Role;
class Roles extends Controller
{
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
$roles = Role::collect();
return $this->response('auth.roles.index', compact('roles'));
}
/**
* Show the form for viewing the specified resource.
*
* @return Response
*/
public function show()
{
return redirect()->route('roles.index');
}
/**
* Show the form for creating a new resource.
*
* @return Response
*/
public function create()
{
$permissions = [];
$actions = ['read', 'create', 'update', 'delete'];
foreach ($actions as $action) {
$permissions[$action] = Permission::action($action)->get()->sortBy('title')->all();
}
return view('auth.roles.create', compact('actions', 'permissions'));
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
*
* @return Response
*/
public function store(Request $request)
{
$response = $this->ajaxDispatch(new CreateRole($request));
if ($response['success']) {
$response['redirect'] = route('roles.index');
$message = trans('messages.success.added', ['type' => trans_choice('general.roles', 1)]);
flash($message)->success();
} else {
$response['redirect'] = route('roles.create');
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
/**
* Show the form for editing the specified resource.
*
* @param Role $role
*
* @return Response
*/
public function edit(Role $role)
{
$permissions = [];
$actions = ['read', 'create', 'update', 'delete'];
foreach ($actions as $action) {
$permissions[$action] = Permission::action($action)->get()->sortBy('title')->all();
}
return view('auth.roles.edit', compact('role', 'actions', 'permissions'));
}
/**
* Update the specified resource in storage.
*
* @param Role $role
* @param Request $request
*
* @return Response
*/
public function update(Role $role, Request $request)
{
$response = $this->ajaxDispatch(new UpdateRole($role, $request));
if ($response['success']) {
$response['redirect'] = route('roles.index');
$message = trans('messages.success.updated', ['type' => $role->display_name]);
flash($message)->success();
} else {
$response['redirect'] = route('roles.edit', $role->id);
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
/**
* Remove the specified resource from storage.
*
* @param Role $role
*
* @return Response
*/
public function destroy(Role $role)
{
$response = $this->ajaxDispatch(new DeleteRole($role));
$response['redirect'] = route('roles.index');
if ($response['success']) {
$message = trans('messages.success.deleted', ['type' => $role->display_name]);
flash($message)->success();
} else {
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
}

View File

@ -5,17 +5,19 @@ namespace App\Http\Controllers\Auth;
use App\Abstracts\Http\Controller;
use App\Events\Auth\LandingPageShowing;
use App\Http\Requests\Auth\User as Request;
use App\Jobs\Auth\CreateInvitation;
use App\Jobs\Auth\CreateUser;
use App\Jobs\Auth\DeleteUser;
use App\Jobs\Auth\UpdateUser;
use App\Models\Auth\User;
use App\Models\Auth\Role;
use App\Models\Auth\User;
use App\Traits\Cloud;
use App\Traits\Uploads;
use Illuminate\Http\Request as BaseRequest;
class Users extends Controller
{
use Uploads;
use Cloud, Uploads;
public function __construct()
{
@ -66,11 +68,13 @@ class Users extends Controller
$roles = Role::all()->reject(function ($r) {
return $r->hasPermission('read-client-portal');
});
})->pluck('display_name', 'id');
$companies = user()->companies()->take(setting('default.select_limit'))->get()->sortBy('name')->pluck('name', 'id');
return view('auth.users.create', compact('roles', 'companies', 'landing_pages'));
$roles_url = $this->getCloudRolesPageUrl();
return view('auth.users.create', compact('roles', 'companies', 'landing_pages', 'roles_url'));
}
/**
@ -87,7 +91,7 @@ class Users extends Controller
if ($response['success']) {
$response['redirect'] = route('users.index');
$message = trans('messages.success.added', ['type' => trans_choice('general.users', 1)]);
$message = trans('messages.success.invited', ['type' => trans_choice('general.users', 1)]);
flash($message)->success();
} else {
@ -125,29 +129,33 @@ class Users extends Controller
// Show only roles with customer permission
$roles = Role::all()->reject(function ($r) {
return !$r->hasPermission('read-client-portal');
});
})->pluck('display_name', 'id');
} else {
// Don't show roles with customer permission
$roles = Role::all()->reject(function ($r) {
return $r->hasPermission('read-client-portal');
});
})->pluck('display_name', 'id');
}
$companies = user()->companies()->take(setting('default.select_limit'))->get()->sortBy('name')->pluck('name', 'id');
if ($user->company_ids) {
foreach($user->company_ids as $company_id) {
foreach ($user->company_ids as $company_id) {
if ($companies->has($company_id)) {
continue;
}
$company = \App\Models\Common\Company::find($company_id);
$company = company($company_id);
$companies->put($company->id, $company->name);
}
}
return view('auth.users.edit', compact('user', 'companies', 'roles', 'landing_pages'));
$roles_url = $this->getCloudRolesPageUrl();
$route = (request()->route()->getName() == 'profile.edit') ? 'profile.update' : 'users.update';
return view('auth.users.edit', compact('user', 'companies', 'roles', 'landing_pages', 'roles_url', 'route'));
}
/**
@ -297,7 +305,7 @@ class Users extends Controller
$column = $request['column'];
$value = $request['value'];
if (!empty($column) && !empty($value)) {
if (! empty($column) && ! empty($value)) {
switch ($column) {
case 'id':
$user = User::find((int) $value);
@ -310,14 +318,40 @@ class Users extends Controller
}
$data = $user;
} elseif (!empty($column) && empty($value)) {
} elseif (! empty($column) && empty($value)) {
$data = trans('validation.required', ['attribute' => $column]);
}
return response()->json([
'errors' => ($user) ? false : true,
'success' => ($user) ? true : false,
'data' => $data
'data' => $data,
]);
}
/**
* Process request for reinviting the specified resource.
*
* @param User $user
*
* @return Response
*/
public function invite(User $user)
{
$response = $this->ajaxDispatch(new CreateInvitation($user, company()));
$response['redirect'] = route('users.index');
if ($response['success']) {
$message = trans('messages.success.invited', ['type' => trans_choice('general.users', 1)]);
flash($message)->success();
} else {
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
}

View File

@ -36,7 +36,7 @@ class Accounts extends Controller
public function show(Account $account)
{
// Handle transactions
$transactions = Transaction::with('account', 'category')->where('account_id', $account->id)->collect('paid_at');
$transactions = Transaction::with('account', 'category')->where('account_id', $account->id)->isNotRecurring()->collect('paid_at');
$transfers = Transfer::with('expense_transaction', 'income_transaction')->get()->filter(function ($transfer) use($account) {
if ($transfer->expense_account->id == $account->id || $transfer->income_account->id == $account->id) {
@ -53,6 +53,7 @@ class Accounts extends Controller
return view('banking.accounts.show', compact('account', 'transactions', 'transfers'));
}
/**
* Show the form for creating a new resource.
*
@ -60,11 +61,9 @@ class Accounts extends Controller
*/
public function create()
{
$currencies = Currency::enabled()->pluck('name', 'code');
$currency = Currency::where('code', '=', setting('default.currency'))->first();
return view('banking.accounts.create', compact('currencies', 'currency'));
return view('banking.accounts.create', compact('currency'));
}
/**
@ -122,13 +121,11 @@ class Accounts extends Controller
*/
public function edit(Account $account)
{
$currencies = Currency::enabled()->pluck('name', 'code');
$account->default_account = ($account->id == setting('default.account')) ? 1 : 0;
$currency = Currency::where('code', '=', $account->currency_code)->first();
return view('banking.accounts.edit', compact('account', 'currencies', 'currency'));
return view('banking.accounts.edit', compact('account', 'currency'));
}
/**
@ -222,18 +219,18 @@ class Accounts extends Controller
return response()->json($response);
}
public function createRevenue(Account $account)
public function createIncome(Account $account)
{
$data['account_id'] = $account->id;
return redirect()->route('revenues.create')->withInput($data);
return redirect()->route('transactions.create', ['type' => 'income'])->withInput($data);
}
public function createPayment(Account $account)
public function createExpense(Account $account)
{
$data['account_id'] = $account->id;
return redirect()->route('payments.create')->withInput($data);
return redirect()->route('transactions.create', ['type' => 'expense'])->withInput($data);
}
public function createTransfer(Account $account)

View File

@ -11,7 +11,7 @@ use App\Jobs\Banking\UpdateReconciliation;
use App\Models\Banking\Account;
use App\Models\Banking\Reconciliation;
use App\Models\Banking\Transaction;
use Date;
use App\Utilities\Date;
class Reconciliations extends Controller
{
@ -24,9 +24,7 @@ class Reconciliations extends Controller
{
$reconciliations = Reconciliation::with('account')->collect();
$accounts = collect(Account::enabled()->orderBy('name')->pluck('name', 'id'));
return $this->response('banking.reconciliations.index', compact('reconciliations', 'accounts'));
return $this->response('banking.reconciliations.index', compact('reconciliations'));
}
/**
@ -46,8 +44,6 @@ class Reconciliations extends Controller
*/
public function create()
{
$accounts = Account::enabled()->pluck('name', 'id');
$account_id = request('account_id', setting('default.account'));
$started_at = request('started_at', Date::now()->firstOfMonth()->toDateString());
$ended_at = request('ended_at', Date::now()->endOfMonth()->toDateString());
@ -60,7 +56,7 @@ class Reconciliations extends Controller
$opening_balance = $this->getOpeningBalance($account, $started_at);
return view('banking.reconciliations.create', compact('accounts', 'account', 'currency', 'opening_balance', 'transactions'));
return view('banking.reconciliations.create', compact('account', 'currency', 'opening_balance', 'transactions'));
}
/**

View File

@ -0,0 +1,222 @@
<?php
namespace App\Http\Controllers\Banking;
use App\Abstracts\Http\Controller;
use App\Http\Requests\Banking\Transaction as Request;
use App\Jobs\Banking\CreateTransaction;
use App\Jobs\Banking\UpdateTransaction;
use App\Models\Banking\Account;
use App\Models\Banking\Transaction;
use App\Models\Common\Recurring;
use App\Models\Setting\Currency;
use App\Traits\Currencies;
use App\Traits\DateTime;
use App\Traits\Transactions as TransactionsTrait;
class RecurringTransactions extends Controller
{
use Currencies, DateTime, TransactionsTrait;
/**
* Instantiate a new controller instance.
*/
public function __construct()
{
// Add CRUD permission check
$this->middleware('permission:create-banking-transactions')->only('create', 'store', 'duplicate', 'import');
$this->middleware('permission:read-banking-transactions')->only('index', 'show', 'edit', 'export');
$this->middleware('permission:update-banking-transactions')->only('update', 'enable', 'disable');
$this->middleware('permission:delete-banking-transactions')->only('destroy');
}
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
$transactions = Transaction::with('category', 'recurring')->isRecurring()->collect(['paid_at'=> 'desc']);
return $this->response('banking.recurring_transactions.index', compact('transactions'));
}
/**
* Show the form for viewing the specified resource.
*
* @return Response
*/
public function show(Transaction $recurring_transaction)
{
$recurring_transaction->load(['category', 'recurring', 'children']);
$title = ($recurring_transaction->type == 'income-recurring') ? trans_choice('general.recurring_incomes', 1) : trans_choice('general.recurring_expenses', 1);
return view('banking.recurring_transactions.show', compact('recurring_transaction', 'title'));
}
/**
* Show the form for creating a new resource.
*
* @return Response
*/
public function create()
{
$type = request()->get('type', 'income-recurring');
$real_type = request()->get('real_type', $this->getRealTypeOfRecurringTransaction($type));
$contact_type = config('type.transaction.' . $real_type . '.contact_type');
$number = $this->getNextTransactionNumber('-recurring');
$account_currency_code = Account::where('id', setting('default.account'))->pluck('currency_code')->first();
$currency = Currency::where('code', $account_currency_code)->first();
return view('banking.recurring_transactions.create', compact(
'type',
'real_type',
'number',
'contact_type',
'account_currency_code',
'currency'
));
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
*
* @return Response
*/
public function store(Request $request)
{
$response = $this->ajaxDispatch(new CreateTransaction($request->merge(['paid_at' => $request->get('recurring_started_at')])));
if ($response['success']) {
$response['redirect'] = route('recurring-transactions.show', $response['data']->id);
$message = trans('messages.success.added', ['type' => trans_choice('general.transactions', 1)]);
flash($message)->success();
} else {
$response['redirect'] = route('recurring-transactions.create');
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
/**
* Duplicate the specified resource.
*
* @param Transaction $recurring_transaction
*
* @return Response
*/
public function duplicate(Transaction $recurring_transaction)
{
$clone = $recurring_transaction->duplicate();
$message = trans('messages.success.duplicated', ['type' => trans_choice('general.transactions', 1)]);
flash($message)->success();
return redirect()->route('recurring-transactions.edit', $clone->id);
}
/**
* Show the form for editing the specified resource.
*
* @param Transaction $recurring_transaction
*
* @return Response
*/
public function edit(Transaction $recurring_transaction)
{
$type = $recurring_transaction->type;
$real_type = request()->get('real_type', $this->getRealTypeOfRecurringTransaction($type));
$contact_type = config('type.transaction.' . $real_type . '.contact_type');
$number = $this->getNextTransactionNumber('-recurring');
$currency = Currency::where('code', $recurring_transaction->currency_code)->first();
$date_format = $this->getCompanyDateFormat();
return view('banking.recurring_transactions.edit', compact(
'type',
'real_type',
'number',
'contact_type',
'recurring_transaction',
'currency',
'date_format'
));
}
/**
* Update the specified resource in storage.
*
* @param Transaction $recurring_transaction
* @param Request $request
*
* @return Response
*/
public function update(Transaction $recurring_transaction, Request $request)
{
$response = $this->ajaxDispatch(new UpdateTransaction($recurring_transaction, $request->merge(['paid_at' => $request->get('recurring_started_at')])));
if ($response['success']) {
$response['redirect'] = route('recurring-transactions.show', $recurring_transaction->id);
$message = trans('messages.success.updated', ['type' => trans_choice('general.transactions', 1)]);
flash($message)->success();
} else {
$response['redirect'] = route('recurring-transactions.edit', $recurring_transaction->id);
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
/**
* End recurring template.
*
* @return Response
*/
public function end(Transaction $recurring_transaction)
{
$response = $this->ajaxDispatch(new UpdateTransaction($recurring_transaction, [
'recurring_frequency' => $recurring_transaction->recurring->frequency,
'recurring_interval' => $recurring_transaction->recurring->interval,
'recurring_started_at' => $recurring_transaction->recurring->started_at,
'recurring_limit' => $recurring_transaction->recurring->limit,
'recurring_limit_count' => $recurring_transaction->recurring->limit_count,
'recurring_limit_date' => $recurring_transaction->recurring->limit_date,
'created_from' => $recurring_transaction->created_from,
'created_by' => $recurring_transaction->created_by,
'recurring_status' => Recurring::END_STATUS,
]));
if ($response['success']) {
$message = trans('messages.success.ended', ['type' => trans_choice('general.recurring_transactions', 1)]);
flash($message)->success();
} else {
$message = $response['message'];
flash($message)->error()->important();
}
return redirect()->route('recurring-transactions.index');
}
}

View File

@ -3,16 +3,31 @@
namespace App\Http\Controllers\Banking;
use App\Abstracts\Http\Controller;
use App\Events\Banking\TransactionPrinting;
use App\Events\Banking\TransactionSent;
use App\Exports\Banking\Transactions as Export;
use App\Http\Requests\Banking\Transaction as Request;
use App\Http\Requests\Banking\TransactionConnect;
use App\Http\Requests\Common\Import as ImportRequest;
use App\Imports\Banking\Transactions as Import;
use App\Jobs\Banking\CreateTransaction;
use App\Jobs\Banking\DeleteTransaction;
use App\Jobs\Banking\MatchBankingDocumentTransaction;
use App\Jobs\Banking\SplitTransaction;
use App\Jobs\Banking\UpdateTransaction;
use App\Models\Banking\Account;
use App\Models\Banking\Transaction;
use App\Models\Setting\Category;
use App\Models\Document\Document;
use App\Models\Setting\Currency;
use App\Notifications\Banking\Transaction as Notification;
use App\Traits\Currencies;
use App\Traits\DateTime;
use App\Traits\Transactions as TransactionsTrait;
class Transactions extends Controller
{
use Currencies, DateTime, TransactionsTrait;
/**
* Display a listing of the resource.
*
@ -20,17 +35,115 @@ class Transactions extends Controller
*/
public function index()
{
$accounts = Account::enabled()->orderBy('name')->pluck('name', 'id');
$transactions = Transaction::with('account', 'category', 'contact')->isNotRecurring()->collect(['paid_at'=> 'desc']);
$types = collect(['expense' => trans_choice('general.expenses', 1), 'income' => trans_choice('general.incomes', 1)])
->prepend(trans('general.all_type', ['type' => trans_choice('general.types', 2)]), '');
$totals = [
'income' => 0,
'expense' => 0,
'profit' => 0,
];
$request_type = !request()->has('type') ? ['income', 'expense'] : request('type');
$categories = Category::enabled()->type($request_type)->orderBy('name')->pluck('name', 'id');
$transactions->each(function ($transaction) use (&$totals) {
if ($transaction->isNotIncome() && $transaction->isNotExpense()) {
return;
}
$transactions = Transaction::with('account', 'category', 'contact')->collect(['paid_at'=> 'desc']);
$totals[$transaction->type] += $transaction->getAmountConvertedToDefault();
});
return $this->response('banking.transactions.index', compact('transactions', 'accounts', 'types', 'categories'));
$totals['profit'] = $totals['income'] - $totals['expense'];
$translations = $this->getTranslationsForConnect('income');
return $this->response('banking.transactions.index', compact(
'transactions',
'translations',
'totals'
));
}
/**
* Show the form for viewing the specified resource.
*
* @return Response
*/
public function show(Transaction $transaction)
{
$title = ($transaction->type == 'income') ? trans_choice('general.receipts', 1) : trans('transactions.payment_made');
return view('banking.transactions.show', compact('transaction', 'title'));
}
/**
* Show the form for creating a new resource.
*
* @return Response
*/
public function create()
{
$type = request()->get('type', 'income');
$number = $this->getNextTransactionNumber();
$contact_type = config('type.transaction.' . $type . '.contact_type');
$account_currency_code = Account::where('id', setting('default.account'))->pluck('currency_code')->first();
$currency = Currency::where('code', $account_currency_code)->first();
return view('banking.transactions.create', compact(
'type',
'number',
'contact_type',
'account_currency_code',
'currency'
));
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
*
* @return Response
*/
public function store(Request $request)
{
$response = $this->ajaxDispatch(new CreateTransaction($request));
if ($response['success']) {
$response['redirect'] = route('transactions.show', $response['data']->id);
$message = trans('messages.success.added', ['type' => trans_choice('general.transactions', 1)]);
flash($message)->success();
} else {
$response['redirect'] = route('transactions.create');
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
/**
* Duplicate the specified resource.
*
* @param Transaction $transaction
*
* @return Response
*/
public function duplicate(Transaction $transaction)
{
$clone = $transaction->duplicate();
$message = trans('messages.success.duplicated', ['type' => trans_choice('general.transactions', 1)]);
flash($message)->success();
return redirect()->route('transactions.edit', $clone->id);
}
/**
@ -57,6 +170,60 @@ class Transactions extends Controller
return response()->json($response);
}
/**
* Show the form for editing the specified resource.
*
* @param Transaction $transaction
*
* @return Response
*/
public function edit(Transaction $transaction)
{
$type = $transaction->type;
$contact_type = config('type.transaction.' . $type . '.contact_type');
$currency = Currency::where('code', $transaction->currency_code)->first();
$date_format = $this->getCompanyDateFormat();
return view('banking.transactions.edit', compact(
'type',
'contact_type',
'transaction',
'currency',
'date_format'
));
}
/**
* Update the specified resource in storage.
*
* @param Transaction $transaction
* @param Request $request
*
* @return Response
*/
public function update(Transaction $transaction, Request $request)
{
$response = $this->ajaxDispatch(new UpdateTransaction($transaction, $request));
if ($response['success']) {
$response['redirect'] = route('transactions.show', $transaction->id);
$message = trans('messages.success.updated', ['type' => trans_choice('general.transactions', 1)]);
flash($message)->success();
} else {
$response['redirect'] = route('transactions.edit', $transaction->id);
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
/**
* Remove the specified resource from storage.
*
@ -92,4 +259,100 @@ class Transactions extends Controller
{
return $this->exportExcel(new Export, trans_choice('general.transactions', 2));
}
/**
* Download the PDF file of transaction.
*
* @param Transaction $transaction
*
* @return Response
*/
public function emailTransaction(Transaction $transaction)
{
if (empty($transaction->contact->email)) {
return redirect()->back();
}
// Notify the customer/vendor
$transaction->contact->notify(new Notification($transaction, config('type.transaction.' . $transaction->type . '.email_template'), true));
event(new TransactionSent($transaction));
flash(trans('documents.messages.email_sent', ['type' => trans_choice('general.transactions', 1)]))->success();
return redirect()->back();
}
/**
* Print the transaction.
*
* @param Transaction $transaction
*
* @return Response
*/
public function printTransaction(Transaction $transaction)
{
event(new TransactionPrinting($transaction));
$view = view('banking.transactions.print_default', compact('transaction'));
return mb_convert_encoding($view, 'HTML-ENTITIES', 'UTF-8');
}
/**
* Download the PDF file of transaction.
*
* @param Transaction $transaction
*
* @return Response
*/
public function pdfTransaction(Transaction $transaction)
{
event(new TransactionPrinting($transaction));
$currency_style = true;
$view = view('banking.transactions.print_default', compact('transaction', 'currency_style'))->render();
$html = mb_convert_encoding($view, 'HTML-ENTITIES', 'UTF-8');
$pdf = app('dompdf.wrapper');
$pdf->loadHTML($html);
//$pdf->setPaper('A4', 'portrait');
$file_name = $this->getTransactionFileName($transaction);
return $pdf->download($file_name);
}
public function connect(Transaction $transaction, TransactionConnect $request)
{
$total_items = count($request->data['items']);
if ($total_items == 1) {
$document = Document::find($request->data['items'][0]['document_id']);
if (!is_null($document)) {
$response = $this->ajaxDispatch(new MatchBankingDocumentTransaction($document, $transaction));
}
}
if ($total_items > 1) {
$response = $this->ajaxDispatch(new SplitTransaction($transaction, $request->data));
}
$response['redirect'] = route('transactions.index');
if ($response['success']) {
$message = trans('messages.success.connected', ['type' => trans_choice('general.transactions', 1)]);
flash($message)->success();
} else {
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
}

View File

@ -13,8 +13,6 @@ use App\Jobs\Banking\DeleteTransfer;
use App\Models\Banking\Account;
use App\Models\Banking\Transfer;
use App\Models\Setting\Currency;
use App\Utilities\Modules;
use Date;
use Illuminate\Support\Str;
class Transfers extends Controller
@ -52,13 +50,9 @@ class Transfers extends Controller
{
$accounts = Account::enabled()->orderBy('name')->pluck('name', 'id');
$payment_methods = Modules::getPaymentMethods();
$currency = Currency::where('code', setting('default.currency'))->first();
$file_types = $this->prepeareFileTypes();
return view('banking.transfers.create', compact('accounts', 'payment_methods', 'currency', 'file_types'));
return view('banking.transfers.create', compact('accounts', 'currency'));
}
/**
@ -142,15 +136,11 @@ class Transfers extends Controller
{
$accounts = Account::enabled()->orderBy('name')->pluck('name', 'id');
$payment_methods = Modules::getPaymentMethods();
$currency_code = ($transfer->expense_transaction->account) ? $transfer->expense_transaction->account->currency_code : setting('default.currency');
$account = $transfer->expense_transaction->account;
$currency = Currency::where('code', $currency_code)->first();
$currency = Currency::where('code', $account->currency_code)->first();
$file_types = $this->prepeareFileTypes();
return view('banking.transfers.edit', compact('transfer', 'accounts', 'payment_methods', 'currency', 'file_types'));
return view('banking.transfers.edit', compact('transfer', 'accounts', 'currency'));
}
/**
@ -259,19 +249,4 @@ class Transfers extends Controller
return $pdf->download($file_name);
}
protected function prepeareFileTypes()
{
$file_type_mimes = explode(',', config('filesystems.mimes'));
$file_types = [];
foreach ($file_type_mimes as $mime) {
$file_types[] = '.' . $mime;
}
$file_types = implode(',', $file_types);
return $file_types;
}
}

View File

@ -20,7 +20,9 @@ class BulkActions extends Controller
*/
public function action($group, $type, Request $request)
{
if ($request->get('handle', '*') == '*') {
$handle = $request->get('handle', '*');
if ($handle == '*') {
return response()->json([
'success' => false,
'redirect' => true,
@ -32,17 +34,20 @@ class BulkActions extends Controller
// Check is module
$module = module($group);
$page = ucfirst($type);
if ($module instanceof \Akaunting\Module\Module) {
$tmp = explode('.', $type);
$file_name = !empty($tmp[1]) ? Str::studly($tmp[0]) . '\\' . Str::studly($tmp[1]) : Str::studly($tmp[0]);
$bulk_actions = app('Modules\\' . $module->getStudlyName() . '\BulkActions\\' . $file_name);
$page = ucfirst($file_name);
} else {
$bulk_actions = app('App\BulkActions\\' . ucfirst($group) . '\\' . ucfirst($type));
}
if (isset($bulk_actions->actions[$request->get('handle')]['permission']) && !user()->can($bulk_actions->actions[$request->get('handle')]['permission'])) {
if (isset($bulk_actions->actions[$handle]['permission']) && !user()->can($bulk_actions->actions[$handle]['permission'])) {
flash(trans('errors.message.403'))->error()->important();
return response()->json([
@ -54,11 +59,21 @@ class BulkActions extends Controller
]);
}
$result = $bulk_actions->{$request->get('handle')}($request);
$result = $bulk_actions->{$handle}($request);
$message = trans($bulk_actions->messages['general'], ['type' => $handle, 'count' => count($request->get('selected'))]);
if (array_key_exists($handle, $bulk_actions->messages)) {
$message = trans($bulk_actions->messages[$handle], ['type' => $page]);
}
if (! empty($result) && ($result instanceof \Symfony\Component\HttpFoundation\BinaryFileResponse)) {
flash($message)->success();
if (!empty($result) && ($result instanceof \Symfony\Component\HttpFoundation\BinaryFileResponse)) {
return $result;
} elseif (!empty($result) && ($result instanceof RedirectResponse)) {
} elseif (! empty($result) && ($result instanceof RedirectResponse)) {
flash($message)->success();
return response()->json([
'success' => true,
'redirect' => $result->getTargetUrl(),
@ -67,6 +82,8 @@ class BulkActions extends Controller
'message' => ''
]);
} else {
flash($message)->success();
return response()->json([
'success' => true,
'redirect' => true,

View File

@ -8,7 +8,6 @@ use App\Jobs\Common\CreateCompany;
use App\Jobs\Common\DeleteCompany;
use App\Jobs\Common\UpdateCompany;
use App\Models\Common\Company;
use App\Models\Setting\Currency;
use App\Traits\Uploads;
use App\Traits\Users;
@ -45,9 +44,7 @@ class Companies extends Controller
*/
public function create()
{
$currencies = Currency::enabled()->pluck('name', 'code');
return view('common.companies.create', compact('currencies'));
return view('common.companies.create');
}
/**
@ -95,9 +92,7 @@ class Companies extends Controller
return redirect()->route('companies.index');
}
$currencies = Currency::enabled()->pluck('name', 'code');
return view('common.companies.edit', compact('company', 'currencies'));
return view('common.companies.edit', compact('company'));
}
/**
@ -214,7 +209,7 @@ class Companies extends Controller
event(new \App\Events\Common\CompanySwitched($company, $old_company_id));
// Check wizard
if (!setting('wizard.completed', false)) {
if (! setting('wizard.completed', false)) {
return redirect()->route('wizard.edit', ['company_id' => $company->id]);
}
}

View File

@ -71,14 +71,16 @@ class Dashboards extends Controller
return Widgets::canShow($widget->class);
});
$user_dashboards = user()->dashboards()->enabled()->get();
$date_picker_shortcuts = $this->getDatePickerShortcuts();
if (!request()->has('start_date')) {
if (! request()->has('start_date')) {
request()->merge(['start_date' => $date_picker_shortcuts[trans('reports.this_year')]['start']]);
request()->merge(['end_date' => $date_picker_shortcuts[trans('reports.this_year')]['end']]);
}
return view('common.dashboards.show', compact('dashboard', 'widgets', 'date_picker_shortcuts'));
return view('common.dashboards.show', compact('dashboard', 'widgets', 'user_dashboards', 'date_picker_shortcuts'));
}
/**
@ -88,7 +90,11 @@ class Dashboards extends Controller
*/
public function create()
{
$users = company()->users()->get()->sortBy('name');
$users = company()->users()->get()->reject(function ($user) {
if ($user->cannot('read-admin-panel')) {
return true;
}
})->sortBy('name');
return view('common.dashboards.create', compact('users'));
}
@ -133,7 +139,11 @@ class Dashboards extends Controller
return redirect()->route('dashboards.index');
}
$users = company()->users()->get()->sortBy('name');
$users = company()->users()->get()->reject(function ($user) {
if ($user->cannot('read-admin-panel')) {
return true;
}
})->sortBy('name');
return view('common.dashboards.edit', compact('dashboard', 'users'));
}

View File

@ -38,9 +38,11 @@ class Import extends Controller
'role' => 'form',
'class' => 'form-loading-button',
'novalidate' => true,
'route' => '',
'url' => '',
];
if (!empty($route)) {
if (! empty($route)) {
$form_params['route'] = $route;
} else {
$form_params['url'] = $path . '/import';

View File

@ -6,14 +6,11 @@ use App\Abstracts\Http\Controller;
use App\Exports\Common\Items as Export;
use App\Http\Requests\Common\Item as Request;
use App\Http\Requests\Common\Import as ImportRequest;
use App\Http\Requests\Common\TotalItem as TotalRequest;
use App\Imports\Common\Items as Import;
use App\Jobs\Common\CreateItem;
use App\Jobs\Common\DeleteItem;
use App\Jobs\Common\UpdateItem;
use App\Models\Common\Item;
use App\Models\Setting\Category;
use App\Models\Setting\Currency;
use App\Models\Setting\Tax;
use App\Traits\Uploads;
@ -28,7 +25,7 @@ class Items extends Controller
*/
public function index()
{
$items = Item::with('category', 'media')->collect();
$items = Item::with('category', 'media', 'taxes')->collect();
return $this->response('common.items.index', compact('items'));
}
@ -50,11 +47,9 @@ class Items extends Controller
*/
public function create()
{
$categories = Category::item()->enabled()->orderBy('name')->take(setting('default.select_limit'))->pluck('name', 'id');
$taxes = Tax::enabled()->orderBy('name')->get()->pluck('title', 'id');
return view('common.items.create', compact('categories', 'taxes'));
return view('common.items.create', compact('taxes'));
}
/**
@ -135,15 +130,9 @@ class Items extends Controller
*/
public function edit(Item $item)
{
$categories = Category::item()->enabled()->orderBy('name')->take(setting('default.select_limit'))->pluck('name', 'id');
if ($item->category && !$categories->has($item->category_id)) {
$categories->put($item->category->id, $item->category->name);
}
$taxes = Tax::enabled()->orderBy('name')->get()->pluck('title', 'id');
return view('common.items.edit', compact('item', 'categories', 'taxes'));
return view('common.items.edit', compact('item', 'taxes'));
}
/**

View File

@ -1,101 +0,0 @@
<?php
namespace App\Http\Controllers\Common;
use App\Abstracts\Http\Controller;
use App\Http\Requests\Common\Notification as Request;
use App\Traits\Modules;
use App\Utilities\Date;
use Illuminate\Support\Str;
class Notifications extends Controller
{
use Modules;
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
return view('common.notifications.index');
}
/**
* Show the form for viewing the specified resource.
*
* @return Response
*/
public function readAll()
{
$notifications = user()->unreadNotifications;
foreach ($notifications as $notification) {
$notification->markAsRead();
}
// Hide New Apps Notifications
$module_notifications = $this->getNotifications('new-apps');
foreach ($module_notifications as $module_notification) {
$prefix = 'notifications.' . user()->id . '.' . $module_notification->alias;
setting()->set([
$prefix . '.name' => $module_notification->name,
$prefix . '.message' => $module_notification->alias,
$prefix . '.date' => Date::now(),
$prefix . '.status' => '0',
]);
}
setting()->save();
$message = trans('messages.success.clear_all', ['type' => Str::lower(trans_choice('general.notifications', 2))]);
flash($message)->success();
return redirect()->route('dashboard');
}
/**
* Disable the specified resource.
*
* @param Company $company
*
* @return Response
*/
public function disable(Request $request)
{
$id = $request['id'];
$path = str_replace('#', '/', $request['path']);
$notifications = $this->getNotifications($path);
foreach ($notifications as $notification) {
if ($notification->id == $id) {
$prefix = 'notifications.' . $path . '.' . $id;
setting()->set([
$prefix . '.name' => $notification->name,
$prefix . '.message' => $notification->message,
$prefix . '.date' => Date::now(),
$prefix . '.status' => '0',
]);
setting()->save();
break;
}
}
return response()->json([
'message' => trans('messages.success.disabled', [
'type' => Str::lower(trans_choice('general.notifications', 2))
]),
'success' => true,
'error' => false,
'data' => null,
]);
}
}

View File

@ -9,7 +9,6 @@ use App\Jobs\Common\DeleteReport;
use App\Jobs\Common\UpdateReport;
use App\Models\Common\Report;
use App\Utilities\Reports as Utility;
use Illuminate\Support\Facades\Cache;
class Reports extends Controller
{
@ -37,7 +36,7 @@ class Reports extends Controller
$reports = Report::orderBy('name')->get();
foreach ($reports as $report) {
if (!Utility::canShow($report->class)) {
if (Utility::cannotShow($report->class)) {
continue;
}
@ -47,17 +46,20 @@ class Reports extends Controller
continue;
}
$ttl = 3600 * 6; // 6 hours
$totals[$report->id] = Cache::remember('reports.totals.' . $report->id, $ttl, function () use ($class) {
return $class->getGrandTotal();
});
$icons[$report->id] = $class->getIcon();
$categories[$class->getCategory()][] = $report;
if (empty($categories[$class->getCategory()])) {
$categories[$class->getCategory()] = [
'name' => $class->getCategory(),
'description' => $class->getCategoryDescription(),
'reports' => [$report],
];
} else {
$categories[$class->getCategory()]['reports'][] = $report;
}
}
return $this->response('common.reports.index', compact('categories', 'totals', 'icons'));
return $this->response('common.reports.index', compact('categories', 'icons'));
}
/**
@ -68,15 +70,12 @@ class Reports extends Controller
*/
public function show(Report $report)
{
if (!Utility::canShow($report->class)) {
if (Utility::cannotShow($report->class)) {
abort(403);
}
$class = Utility::getClassInstance($report);
// Update cache
Cache::put('reports.totals.' . $report->id, $class->getGrandTotal());
return $class->show();
}
@ -215,7 +214,7 @@ class Reports extends Controller
*/
public function print(Report $report)
{
if (!Utility::canShow($report->class)) {
if (Utility::cannotShow($report->class)) {
abort(403);
}
@ -230,7 +229,7 @@ class Reports extends Controller
*/
public function export(Report $report)
{
if (!Utility::canShow($report->class)) {
if (Utility::cannotShow($report->class)) {
abort(403);
}
@ -257,7 +256,7 @@ class Reports extends Controller
$fields = (new $class())->getFields();
$html = view('partials.reports.fields', compact('fields'))->render();
$html = view('components.reports.fields', compact('fields'))->render();
return response()->json([
'success' => true,
@ -266,23 +265,4 @@ class Reports extends Controller
'html' => $html,
]);
}
/**
* Clear the cache of the resource.
*
* @return Response
*/
public function clear(Report $report)
{
$data = Utility::getClassInstance($report)->getGrandTotal();
Cache::put('reports.totals.' . $report->id, $data);
return response()->json([
'success' => true,
'error' => false,
'data' => $data,
'message' => '',
]);
}
}

View File

@ -82,7 +82,7 @@ class Uploads extends Controller
$file = $media;
$html = view('partials.media.file', compact('file', 'column_name', 'options'))->render();
$html = view('components.media.file', compact('file', 'column_name', 'options'))->render();
return response()->json([
'success' => true,

View File

@ -3,9 +3,9 @@
namespace App\Http\Controllers\Install;
use App\Http\Requests\Install\Setting as Request;
use App\Http\Requests\Install\Setting;
use App\Utilities\Installer;
use Illuminate\Routing\Controller;
use Illuminate\Support\Facades\DB;
class Settings extends Controller
{
@ -22,17 +22,19 @@ class Settings extends Controller
/**
* Store a newly created resource in storage.
*
* @param Setting $request
* @param $request
*
* @return Response
*/
public function store(Setting $request)
public function store(Request $request)
{
// Create company
Installer::createCompany($request->get('company_name'), $request->get('company_email'), session('locale'));
DB::transaction(function () use ($request) {
// Create company
Installer::createCompany($request->get('company_name'), $request->get('company_email'), session('locale'));
// Create user
Installer::createUser($request->get('user_email'), $request->get('user_password'), session('locale'));
// Create user
Installer::createUser($request->get('user_email'), $request->get('user_password'), session('locale'));
});
// Make the final touches
Installer::finalTouches();

View File

@ -5,7 +5,6 @@ namespace App\Http\Controllers\Modals;
use App\Abstracts\Http\Controller;
use App\Http\Requests\Banking\Account as Request;
use App\Jobs\Banking\CreateAccount;
use App\Models\Banking\Account;
use App\Models\Setting\Currency;
class Accounts extends Controller
@ -29,11 +28,9 @@ class Accounts extends Controller
*/
public function create()
{
$currencies = Currency::enabled()->pluck('name', 'code');
$currency = Currency::where('code', '=', setting('default.currency'))->first();
$html = view('modals.accounts.create', compact('currencies', 'currency'))->render();
$html = view('modals.accounts.create', compact('currency'))->render();
return response()->json([
'success' => true,

View File

@ -14,7 +14,7 @@ class Companies extends Controller
{
// Add CRUD permission check
$this->middleware('permission:read-settings-company')->only('index', 'show', 'edit', 'export');
$this->middleware('permission:update-settings-settings')->only('update', 'enable', 'disable');
$this->middleware('permission:update-settings-company')->only('update', 'enable', 'disable');
}
/**

View File

@ -7,7 +7,6 @@ use App\Http\Requests\Common\Contact as Request;
use App\Models\Common\Contact;
use App\Jobs\Common\CreateContact;
use App\Jobs\Common\UpdateContact;
use App\Models\Setting\Currency;
class Customers extends Controller
{
@ -30,17 +29,13 @@ class Customers extends Controller
*/
public function create()
{
$currencies = Currency::enabled()->orderBy('name')->pluck('name', 'code')->toArray();
$contact_selector = false;
if (request()->has('contact_selector')) {
$contact_selector = request()->get('contact_selector');
}
$rand = rand();
$html = view('modals.customers.create', compact('currencies', 'contact_selector', 'rand'))->render();
$html = view('modals.customers.create', compact('contact_selector'))->render();
return response()->json([
'success' => true,
@ -80,17 +75,13 @@ class Customers extends Controller
*/
public function edit(Contact $customer)
{
$currencies = Currency::enabled()->pluck('name', 'code');
$contact_selector = false;
if (request()->has('contact_selector')) {
$contact_selector = request()->get('contact_selector');
}
$rand = rand();
$html = view('modals.customers.edit', compact('customer', 'currencies', 'contact_selector', 'rand'))->render();
$html = view('modals.customers.edit', compact('customer', 'contact_selector'))->render();
return response()->json([
'success' => true,

View File

@ -15,8 +15,8 @@ class DocumentItemColumns extends Controller
public function __construct()
{
// Add CRUD permission check
$this->middleware('permission:read-settings-settings')->only('index', 'edit');
$this->middleware('permission:update-settings-settings')->only('update', 'enable', 'disable');
$this->middleware('permission:read-settings-invoice')->only('index', 'edit');
$this->middleware('permission:update-settings-invoice')->only('update', 'enable', 'disable');
}
/**
@ -31,6 +31,7 @@ class DocumentItemColumns extends Controller
$type = request()->get('type', 'invoice');
$item_names = [
'hide' => trans('settings.invoice.hide.item_name'),
'settings.invoice.item' => trans('settings.' . $type . '.item'),
'settings.invoice.product' => trans('settings.' . $type . '.product'),
'settings.invoice.service' => trans('settings.' . $type . '.service'),
@ -38,12 +39,14 @@ class DocumentItemColumns extends Controller
];
$price_names = [
'hide' => trans('settings.invoice.hide.price'),
'settings.invoice.price' => trans('settings.' . $type . '.price'),
'settings.invoice.rate' => trans('settings.' . $type . '.rate'),
'custom' => trans('settings.invoice.custom'),
];
$quantity_names = [
'hide' => trans('settings.invoice.hide.quantity'),
'settings.invoice.quantity' => trans('settings.' . $type . '.quantity'),
'custom' => trans('settings.invoice.custom'),
];

View File

@ -5,16 +5,18 @@ namespace App\Http\Controllers\Modals;
use App\Abstracts\Http\Controller;
use App\Http\Requests\Banking\Transaction as Request;
use App\Jobs\Banking\CreateBankingDocumentTransaction;
use App\Models\Banking\Account;
use App\Jobs\Banking\UpdateBankingDocumentTransaction;
use App\Models\Banking\Transaction;
use App\Models\Document\Document;
use App\Models\Setting\Currency;
use App\Utilities\Modules;
use App\Traits\Uploads;
use App\Traits\Transactions;
class DocumentTransactions extends Controller
{
use Uploads;
use Uploads, Transactions;
/**
* Instantiate a new controller instance.
@ -37,16 +39,12 @@ class DocumentTransactions extends Controller
*/
public function create(Document $document)
{
$accounts = Account::enabled()->orderBy('name')->pluck('name', 'id');
$currencies = Currency::enabled()->orderBy('name')->pluck('name', 'code')->toArray();
$currency = Currency::where('code', $document->currency_code)->first();
$payment_methods = Modules::getPaymentMethods();
$paid = $document->paid;
$number = $this->getNextTransactionNumber();
// Get document Totals
foreach ($document->totals as $document_total) {
$document->{$document_total->code} = $document_total->amount;
@ -56,11 +54,29 @@ class DocumentTransactions extends Controller
$document->grand_total = money($total, $currency->code)->getAmount();
if (!empty($paid)) {
if (! empty($paid)) {
$document->grand_total = round($document->total - $paid, $currency->precision);
}
$html = view('modals.documents.payment', compact('document', 'accounts', 'currencies', 'currency', 'payment_methods'))->render();
$buttons = [
'cancel' => [
'text' => trans('general.cancel'),
'class' => 'btn-outline-secondary'
],
'payment' => [
'text' => trans('invoices.accept_payments'),
'class' => 'long-texts',
'url' => route('apps.categories.show', 'payment-method')
],
'confirm' => [
'text' => trans('general.save'),
'class' => 'disabled:bg-green-100'
],
];
$route = ['modals.documents.document.transactions.store', $document->id];
$html = view('modals.documents.payment', compact('document', 'route', 'currency', 'number'))->render();
return response()->json([
'success' => true,
@ -69,21 +85,7 @@ class DocumentTransactions extends Controller
'html' => $html,
'data' => [
'title' => trans('general.title.new', ['type' => trans_choice('general.payments', 1)]),
'buttons' => [
'cancel' => [
'text' => trans('general.cancel'),
'class' => 'btn-outline-secondary'
],
'payment' => [
'text' => trans('invoices.accept_payments'),
'class' => 'long-texts',
'url' => route('apps.categories.show', 'payment-method')
],
'confirm' => [
'text' => trans('general.save'),
'class' => 'btn-success'
]
]
'buttons' => $buttons,
]
]);
}
@ -101,9 +103,99 @@ class DocumentTransactions extends Controller
$response = $this->ajaxDispatch(new CreateBankingDocumentTransaction($document, $request));
if ($response['success']) {
$route = config('type.' . $document->type . '.route.prefix');
$route = config('type.document.' . $document->type . '.route.prefix');
if ($alias = config('type.' . $document->type . '.alias')) {
if ($alias = config('type.document.' . $document->type . '.alias')) {
$route = $alias . '.' . $route;
}
$response['redirect'] = route($route . '.show', $document->id);
$message = trans('messages.success.added', ['type' => trans_choice('general.payments', 1)]);
flash($message)->success();
} else {
$response['redirect'] = null;
}
return response()->json($response);
}
/**
* Show the form for creating a new resource.
*
* @param Document $document
*
* @return Response
*/
public function edit(Document $document, Transaction $transaction)
{
$currency = Currency::where('code', $document->currency_code)->first();
$paid = $document->paid;
$number = $this->getNextTransactionNumber();
// Get document Totals
foreach ($document->totals as $document_total) {
$document->{$document_total->code} = $document_total->amount;
}
$total = money($document->total, $currency->code, true)->format();
$document->grand_total = money($total, $currency->code)->getAmount();
if (! empty($paid)) {
$document->grand_total = round($document->total - $paid, $currency->precision);
}
$buttons = [
'cancel' => [
'text' => trans('general.cancel'),
'class' => 'btn-outline-secondary'
],
'payment' => [
'text' => trans('invoices.accept_payments'),
'class' => 'long-texts',
'url' => route('apps.categories.show', 'payment-method')
],
'confirm' => [
'text' => trans('general.save'),
'class' => 'disabled:bg-green-100'
],
];
$route = ['modals.documents.document.transactions.update', $document->id, $transaction->id];
$html = view('modals.documents.payment', compact('document', 'transaction', 'route', 'currency', 'number'))->render();
return response()->json([
'success' => true,
'error' => false,
'message' => 'null',
'html' => $html,
'data' => [
'title' => trans('general.title.edit', ['type' => trans_choice('general.payments', 1)]),
'buttons' => $buttons,
]
]);
}
/**
* Update the specified resource in storage.
*
* @param $item
* @param $request
* @return Response
*/
public function update(Document $document, Transaction $transaction, Request $request)
{
$response = $this->ajaxDispatch(new UpdateBankingDocumentTransaction($document, $transaction, $request));
if ($response['success']) {
$route = config('type.document.' . $document->type . '.route.prefix');
if ($alias = config('type.document.' . $document->type . '.alias')) {
$route = $alias . '.' . $route;
}

View File

@ -0,0 +1,92 @@
<?php
namespace App\Http\Controllers\Modals;
use App\Abstracts\Http\Controller;
use App\Models\Document\Document;
use App\Notifications\Sale\Invoice as Notification;
use App\Jobs\Document\SendDocumentAsCustomMail;
use App\Http\Requests\Common\CustomMail as Request;
class InvoiceEmails extends Controller
{
/**
* Instantiate a new controller instance.
*/
public function __construct()
{
// Add CRUD permission check
$this->middleware('permission:create-sales-invoices')->only('create', 'store', 'duplicate', 'import');
$this->middleware('permission:read-sales-invoices')->only('index', 'show', 'edit', 'export');
$this->middleware('permission:update-sales-invoices')->only('update', 'enable', 'disable');
$this->middleware('permission:delete-sales-invoices')->only('destroy');
}
/**
* Show the form for creating a new resource.
*
* @param Document $invoice
*
* @return Response
*/
public function create(Document $invoice)
{
$notification = new Notification($invoice, 'invoice_new_customer', true);
$store_route = 'modals.invoices.emails.store';
$html = view('modals.invoices.email', compact('invoice', 'notification', 'store_route'))->render();
return response()->json([
'success' => true,
'error' => false,
'message' => 'null',
'html' => $html,
'data' => [
'title' => trans('general.title.new', ['type' => trans_choice('general.email', 1)]),
'buttons' => [
'cancel' => [
'text' => trans('general.cancel'),
'class' => 'btn-outline-secondary',
],
'confirm' => [
'text' => trans('general.send'),
'class' => 'disabled:bg-green-100',
]
]
]
]);
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
*
* @return Response
*/
public function store(Request $request)
{
$response = $this->ajaxDispatch(new SendDocumentAsCustomMail($request, 'invoice_new_customer'));
if ($response['success']) {
$invoice = Document::find($request->get('document_id'));
$route = config('type.document.' . $invoice->type . '.route.prefix');
if ($alias = config('type.document.' . $invoice->type . '.alias')) {
$route = $alias . '.' . $route;
}
$response['redirect'] = route($route . '.show', $invoice->id);
$message = trans('documents.messages.email_sent', ['type' => trans_choice('general.invoices', 1)]);
flash($message)->success();
} else {
$response['redirect'] = null;
}
return response()->json($response);
}
}

View File

@ -0,0 +1,81 @@
<?php
namespace App\Http\Controllers\Modals;
use App\Abstracts\Http\Controller;
use App\Models\Document\Document;
use Illuminate\Support\Facades\URL;
class InvoiceShare extends Controller
{
/**
* Instantiate a new controller instance.
*/
public function __construct()
{
// Add CRUD permission check
$this->middleware('permission:create-sales-invoices')->only('create', 'store', 'duplicate', 'import');
$this->middleware('permission:read-sales-invoices')->only('index', 'show', 'edit', 'export');
$this->middleware('permission:update-sales-invoices')->only('update', 'enable', 'disable');
$this->middleware('permission:delete-sales-invoices')->only('destroy');
}
/**
* Show the form for creating a new resource.
*
* @param Document $invoice
*
* @return Response
*/
public function create(Document $invoice)
{
$page = config('type.document.' . $invoice->type . '.route.prefix');
$alias = config('type.document.' . $invoice->type . '.alias');
$route = '';
if (! empty($alias)) {
$route .= $alias . '.';
}
$preview_route = $route . 'preview.' . $page . '.show';
$signed_route = $route . 'signed.' . $page . '.show';
try {
$previewUrl = route($preview_route, $invoice->id);
} catch (\Exception $e) {
$previewUrl = '';
}
try {
route($signed_route, [$this->document->id, 'company_id' => company_id()]);
$signedUrl = URL::signedRoute($signed_route, [$invoice->id]);
} catch (\Exception $e) {
$signedUrl = URL::signedRoute('signed.invoices.show', [$invoice->id]);
}
$html = view('modals.invoices.share', compact('invoice', 'previewUrl', 'signedUrl'))->render();
return response()->json([
'success' => true,
'error' => false,
'message' => 'null',
'html' => $html,
'data' => [
'title' => trans('general.title.new', ['type' => trans('general.share_link')]),
'success_message' => trans('invoices.share.success_message'),
'buttons' => [
'cancel' => [
'text' => trans('general.cancel'),
'class' => 'btn-outline-secondary',
],
'confirm' => [
'text' => trans('general.copy_link'),
'class' => 'disabled:bg-green-100',
],
]
]
]);
}
}

View File

@ -12,10 +12,10 @@ class InvoiceTemplates extends Controller
public function __construct()
{
// Add CRUD permission check
$this->middleware('permission:create-settings-settings')->only('create', 'store');
$this->middleware('permission:read-settings-settings')->only('index', 'edit');
$this->middleware('permission:update-settings-settings')->only('update', 'enable', 'disable');
$this->middleware('permission:delete-settings-settings')->only('destroy');
$this->middleware('permission:create-settings-invoice')->only('create', 'store');
$this->middleware('permission:read-settings-invoice')->only('index', 'edit');
$this->middleware('permission:update-settings-invoice')->only('update', 'enable', 'disable');
$this->middleware('permission:delete-settings-invoice')->only('destroy');
}
/**

View File

@ -4,7 +4,6 @@ namespace App\Http\Controllers\Modals;
use App\Abstracts\Http\Controller;
use App\Jobs\Common\CreateItem;
use App\Models\Setting\Category;
use App\Models\Setting\Currency;
use App\Models\Setting\Tax;
use Illuminate\Http\Request as IRequest;
@ -30,13 +29,11 @@ class Items extends Controller
*/
public function create(IRequest $request)
{
$categories = Category::item()->enabled()->orderBy('name')->take(setting('default.select_limit'))->pluck('name', 'id');
$taxes = Tax::enabled()->orderBy('name')->get()->pluck('title', 'id');
$currency = Currency::where('code', setting('default.currency'))->first();
$html = view('modals.items.create', compact('categories', 'taxes', 'currency'))->render();
$html = view('modals.items.create', compact('taxes', 'currency'))->render();
return response()->json([
'success' => true,

View File

@ -0,0 +1,96 @@
<?php
namespace App\Http\Controllers\Modals;
use App\Abstracts\Http\Controller;
use App\Models\Banking\Transaction;
use App\Notifications\Banking\Transaction as Notification;
use App\Jobs\Banking\SendTransactionAsCustomMail;
use App\Http\Requests\Common\CustomMail as Request;
class TransactionEmails extends Controller
{
/**
* Instantiate a new controller instance.
*/
public function __construct()
{
// Add CRUD permission check
$this->middleware('permission:create-banking-transactions')->only('create', 'store', 'duplicate', 'import');
$this->middleware('permission:read-banking-transactions')->only('index', 'show', 'edit', 'export');
$this->middleware('permission:update-banking-transactions')->only('update', 'enable', 'disable');
$this->middleware('permission:delete-banking-transactions')->only('destroy');
}
/**
* Show the form for creating a new resource.
*
* @param Transaction $transaction
*
* @return Response
*/
public function create(Transaction $transaction)
{
$email_template = config('type.transaction.' . $transaction->type . '.email_template');
$notification = new Notification($transaction, $email_template, true);
$store_route = 'modals.transactions.emails.store';
$html = view('modals.transactions.email', compact('transaction', 'notification', 'store_route'))->render();
return response()->json([
'success' => true,
'error' => false,
'message' => 'null',
'html' => $html,
'data' => [
'title' => trans('general.title.new', ['type' => trans_choice('general.email', 1)]),
'buttons' => [
'cancel' => [
'text' => trans('general.cancel'),
'class' => 'btn-outline-secondary',
],
'confirm' => [
'text' => trans('general.send'),
'class' => 'disabled:bg-green-100',
]
]
]
]);
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
*
* @return Response
*/
public function store(Request $request)
{
$transaction = Transaction::find($request->get('transaction_id'));
$email_template = config('type.transaction.' . $transaction->type . '.email_template');
$response = $this->ajaxDispatch(new SendTransactionAsCustomMail($request, $email_template));
if ($response['success']) {
$route = config('type.transaction.' . $transaction->type . '.route.prefix');
if ($alias = config('type.transaction.' . $transaction->type . '.alias')) {
$route = $alias . '.' . $route;
}
$response['redirect'] = route($route . '.show', $transaction->id);
$message = trans('documents.messages.email_sent', ['type' => trans_choice('general.transactions', 1)]);
flash($message)->success();
} else {
$response['redirect'] = null;
}
return response()->json($response);
}
}

View File

@ -0,0 +1,80 @@
<?php
namespace App\Http\Controllers\Modals;
use App\Abstracts\Http\Controller;
use App\Models\Banking\Transaction;
use Illuminate\Support\Facades\URL;
class TransactionShare extends Controller
{
/**
* Instantiate a new controller instance.
*/
public function __construct()
{
// Add CRUD permission check
$this->middleware('permission:create-banking-transactions')->only('create', 'store', 'duplicate', 'import');
$this->middleware('permission:read-banking-transactions')->only('index', 'show', 'edit', 'export');
$this->middleware('permission:update-banking-transactions')->only('update', 'enable', 'disable');
$this->middleware('permission:delete-banking-transactions')->only('destroy');
}
/**
* Show the form for creating a new resource.
*
* @param Transaction $transaction
*
* @return Response
*/
public function create(Transaction $transaction)
{
$alias = config('type.transaction.' . $transaction->type . '.alias');
$route = '';
if (! empty($alias)) {
$route .= $alias . '.';
}
$preview_route = $route . 'preview.payments.show';
$signed_route = $route . 'signed.payments.show';
try {
$previewUrl = route($preview_route, $transaction->id);
} catch (\Exception $e) {
$previewUrl = '';
}
try {
route($signed_route, [$this->document->id, 'company_id' => company_id()]);
$signedUrl = URL::signedRoute($signed_route, [$transaction->id]);
} catch (\Exception $e) {
$signedUrl = URL::signedRoute('signed.payments.show', [$transaction->id]);
}
$html = view('modals.transactions.share', compact('transaction', 'previewUrl', 'signedUrl'))->render();
return response()->json([
'success' => true,
'error' => false,
'message' => 'null',
'html' => $html,
'data' => [
'title' => trans('general.title.new', ['type' => trans('general.share_link')]),
'success_message' => trans('invoices.share.success_message'),
'buttons' => [
'cancel' => [
'text' => trans('general.cancel'),
'class' => 'btn-outline-secondary',
],
'confirm' => [
'text' => trans('general.copy_link'),
'class' => 'disabled:bg-green-100',
],
]
]
]);
}
}

View File

@ -12,10 +12,10 @@ class TransferTemplates extends Controller
public function __construct()
{
// Add CRUD permission check
$this->middleware('permission:create-settings-settings')->only('create', 'store');
$this->middleware('permission:read-settings-settings')->only('index', 'edit');
$this->middleware('permission:update-settings-settings')->only('update', 'enable', 'disable');
$this->middleware('permission:delete-settings-settings')->only('destroy');
$this->middleware('permission:create-banking-transfers')->only('create', 'store');
$this->middleware('permission:read-banking-transfers')->only('index', 'edit');
$this->middleware('permission:update-banking-transfers')->only('update', 'enable', 'disable');
$this->middleware('permission:delete-banking-transfers')->only('destroy');
}
/**

View File

@ -7,7 +7,6 @@ use App\Http\Requests\Common\Contact as Request;
use App\Models\Common\Contact;
use App\Jobs\Common\CreateContact;
use App\Jobs\Common\UpdateContact;
use App\Models\Setting\Currency;
class Vendors extends Controller
{
@ -30,17 +29,13 @@ class Vendors extends Controller
*/
public function create()
{
$currencies = Currency::enabled()->orderBy('name')->pluck('name', 'code')->toArray();
$contact_selector = false;
if (request()->has('contact_selector')) {
$contact_selector = request()->get('contact_selector');
}
$rand = rand();
$html = view('modals.vendors.create', compact('currencies', 'contact_selector', 'rand'))->render();
$html = view('modals.vendors.create', compact('contact_selector'))->render();
return response()->json([
'success' => true,
@ -79,17 +74,13 @@ class Vendors extends Controller
*/
public function edit(Contact $vendor)
{
$currencies = Currency::enabled()->pluck('name', 'code');
$contact_selector = false;
if (request()->has('contact_selector')) {
$contact_selector = request()->get('contact_selector');
}
$rand = rand();
$html = view('modals.vendors.edit', compact('vendor', 'currencies', 'contact_selector', 'rand'))->render();
$html = view('modals.vendors.edit', compact('vendor','contact_selector'))->render();
return response()->json([
'success' => true,

View File

@ -3,13 +3,9 @@
namespace App\Http\Controllers\Modules;
use App\Abstracts\Http\Controller;
use App\Traits\Modules;
use App\Models\Module\Module;
class Home extends Controller
{
use Modules;
/**
* Display a listing of the resource.
*
@ -17,19 +13,7 @@ class Home extends Controller
*/
public function index()
{
$data = [
'query' => [
'limit' => 4
]
];
$pre_sale = $this->getPreSaleModules($data);
$paid = $this->getPaidModules($data);
$new = $this->getNewModules($data);
$free = $this->getFreeModules($data);
$installed = Module::all()->pluck('enabled', 'alias')->toArray();
return $this->response('modules.home.index', compact('pre_sale', 'paid', 'new', 'free', 'installed'));
return $this->response('modules.home.index');
}
/**

View File

@ -276,10 +276,10 @@ class Item extends Controller
public function uninstall($alias)
{
try {
$name = module($alias)->getName();
$this->dispatch(new UninstallModule($alias, company_id()));
$name = module($alias)->getName();
$message = trans('modules.uninstalled', ['module' => $name]);
flash($message)->success();
@ -295,9 +295,9 @@ class Item extends Controller
public function enable($alias)
{
try {
$name = module($alias)->getName();
$this->dispatch(new EnableModule($alias, company_id()));
$name = module($alias)->getName();
$message = trans('modules.enabled', ['module' => $name]);
@ -314,10 +314,10 @@ class Item extends Controller
public function disable($alias)
{
try {
$name = module($alias)->getName();
$this->dispatch(new DisableModule($alias, company_id()));
$name = module($alias)->getName();
$message = trans('modules.disabled', ['module' => $name]);
flash($message)->success();
@ -340,7 +340,7 @@ class Item extends Controller
$releases = $this->getModuleReleases($alias, $data);
$html = view('partials.modules.releases', compact('releases'))->render();
$html = view('components.layouts.modules.releases', compact('releases'))->render();
return response()->json([
'success' => true,
@ -361,7 +361,7 @@ class Item extends Controller
$reviews = $this->getModuleReviews($alias, $data);
$html = view('partials.modules.reviews', compact('reviews'))->render();
$html = view('components.layouts.modules.reviews', compact('reviews'))->render();
return response()->json([
'success' => true,

View File

@ -3,13 +3,9 @@
namespace App\Http\Controllers\Modules;
use App\Abstracts\Http\Controller;
use App\Models\Module\Module;
use App\Traits\Modules;
class My extends Controller
{
use Modules;
/**
* Display a listing of the resource.
*
@ -17,10 +13,6 @@ class My extends Controller
*/
public function index()
{
$purchased = $this->getMyModules();
$modules = $this->getInstalledModules();
$installed = Module::where('company_id', '=', company_id())->pluck('enabled', 'alias')->toArray();
return $this->response('modules.my.index', compact('purchased', 'modules', 'installed'));
return $this->response('modules.my.index');
}
}

View File

@ -3,10 +3,10 @@
namespace App\Http\Controllers\Modules;
use App\Traits\Modules;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use App\Models\Module\Module;
use App\Abstracts\Http\Controller;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
class Tiles extends Controller
{
@ -23,13 +23,13 @@ class Tiles extends Controller
{
$page = request('page', 1);
$request = [
$data = [
'query' => [
'page' => $page,
]
];
$data = $this->getModulesByCategory($alias, $request);
$data = $this->getModulesByCategory($alias, $data);
if (empty($data)) {
return redirect()->route('apps.home.index')->send();
@ -39,7 +39,7 @@ class Tiles extends Controller
$modules = !empty($data->modules) ? $data->modules : [];
$installed = Module::all()->pluck('enabled', 'alias')->toArray();
return view('modules.tiles.index', compact('title', 'modules', 'installed'));
return $this->response('modules.tiles.index', compact('modules', 'title', 'installed'));
}
/**
@ -53,19 +53,19 @@ class Tiles extends Controller
{
$page = request('page', 1);
$request = [
$data = [
'query' => [
'page' => $page,
]
];
$data = $this->getModulesByVendor($alias, $request);
$data = $this->getModulesByVendor($alias, $data);
$title = !empty($data->vendor) ? $data->vendor->name : Str::studly($alias);
$modules = !empty($data->modules) ? $data->modules : [];
$installed = Module::all()->pluck('enabled', 'alias')->toArray();
return view('modules.tiles.index', compact('title', 'modules', 'installed'));
return $this->response('modules.tiles.index', compact('modules', 'title', 'installed'));
}
/**
@ -87,7 +87,7 @@ class Tiles extends Controller
$modules = $this->getPaidModules($data);
$installed = Module::all()->pluck('enabled', 'alias')->toArray();
return view('modules.tiles.index', compact('title', 'modules', 'installed'));
return $this->response('modules.tiles.index', compact('modules', 'title', 'installed'));
}
/**
@ -109,7 +109,7 @@ class Tiles extends Controller
$modules = $this->getNewModules($data);
$installed = Module::all()->pluck('enabled', 'alias')->toArray();
return view('modules.tiles.index', compact('title', 'modules', 'installed'));
return $this->response('modules.tiles.index', compact('modules', 'title', 'installed'));
}
/**
@ -131,7 +131,7 @@ class Tiles extends Controller
$modules = $this->getFreeModules($data);
$installed = Module::all()->pluck('enabled', 'alias')->toArray();
return view('modules.tiles.index', compact('title', 'modules', 'installed'));
return $this->response('modules.tiles.index', compact('modules', 'title','installed'));
}
/**
@ -141,8 +141,8 @@ class Tiles extends Controller
*/
public function searchModules(Request $request)
{
$keyword = $request['keyword'];
$page = request('page', 1);
$keyword = $request->get('keyword');
$page = $request->get('page', 1);
$data = [
'query' => [
@ -157,4 +157,87 @@ class Tiles extends Controller
return view('modules.tiles.index', compact('title', 'modules', 'keyword', 'installed'));
}
public function loadMore($type, Request $request)
{
$page = $request->get('page', 1);
$modules = [];
$data = [
'query' => [
'page' => $page,
]
];
$last_page = 1;
switch ($type) {
case 'categories':
$alias = $request->get('alias');
$response = $this->getModulesByCategory($alias, $data);
$response = !empty($response->modules) ? $response->modules : [];
$last_page = ! empty($response) ? $response->last_page : 1;
$modules = $this->prepareModules($response);
break;
case 'vendors':
$alias = $request->get('alias');
$response = $this->getModulesByVendor($alias, $data);
$response = !empty($response->modules) ? $response->modules : [];
$last_page = ! empty($response) ? $response->last_page : 1;
$modules = $this->prepareModules($response);
break;
case 'paid':
$response = $this->getPaidModules($data);
$last_page = $response->last_page;
$modules = $this->prepareModules($response);
break;
case 'new':
$response = $this->getNewModules($data);
$last_page = $response->last_page;
$modules = $this->prepareModules($response);
break;
case 'free':
$response = $this->getFreeModules($data);
$last_page = $response->last_page;
$modules = $this->prepareModules($response);
break;
case 'search':
$data['query']['keyword'] = $request->get('keyword');
$response = $this->getSearchModules($data);
$last_page = $response->last_page;
$modules = $this->prepareModules($response);
break;
}
$html = view('components.modules.raw_items', compact('modules'))->render();
return response()->json([
'success' => true,
'error' => false,
'message' => 'null',
'modules' => $modules,
'last_page' => $last_page,
'html' => $html,
]);
}
protected function prepareModules($response)
{
if (! empty($response->data)) {
return $response->data;
}
return $response;
}
}

View File

@ -5,7 +5,6 @@ namespace App\Http\Controllers\Portal;
use App\Models\Document\Document;
use App\Traits\Charts;
use App\Traits\DateTime;
use App\Utilities\Chartjs;
use Date;
class Dashboard
@ -38,82 +37,10 @@ class Dashboard
//$invoices = Document::invoice()->accrued()->where('contact_id', $contact->id)->get();
$invoices = Document::invoice()->accrued()->whereBetween('due_at', [$start, $end])->where('contact_id', $contact->id)->get();
$start_month = $start->month;
$end_month = $end->month;
// look cashFlow widget
$end_month = $end->diffInMonths($start);
$start_month = 0;
// Monthly
$labels = [];
$s = clone $start;
for ($j = $end_month; $j >= $start_month; $j--) {
$labels[$end_month - $j] = $s->format('M Y');
$s->addMonth();
}
$amounts = $this->calculateAmounts($invoices, $start, $end);
$grand = array_sum($amounts['unpaid']) + array_sum($amounts['paid']) + array_sum($amounts['overdue']);
$totals = [
'paid' => money(array_sum($amounts['paid']), setting('default.currency'), true),
'unpaid' => money(array_sum($amounts['unpaid']), setting('default.currency'), true),
'overdue' => money(array_sum($amounts['overdue']), setting('default.currency'), true),
];
$progress = [
'paid' => !empty($grand) ? (100 / $grand) * array_sum($amounts['paid']) : '0',
'unpaid' => !empty($grand) ? (100 / $grand) * array_sum($amounts['unpaid']) : '0',
'overdue' => !empty($grand) ? (100 / $grand) * array_sum($amounts['overdue']) : '0',
];
$chart = new Chartjs();
$chart->type('line')
->width(0)
->height(300)
->options($this->getLineChartOptions())
->labels(array_values($labels));
$chart->dataset(trans('general.paid'), 'line', array_values($amounts['paid']))
->backgroundColor('#6da252')
->color('#6da252')
->options([
'borderWidth' => 4,
'pointStyle' => 'line',
])
->fill(false);
$chart->dataset(trans('general.unpaid'), 'line', array_values($amounts['unpaid']))
->backgroundColor('#efad32')
->color('#efad32')
->options([
'borderWidth' => 4,
'pointStyle' => 'line',
])
->fill(false);
$chart->dataset(trans('general.overdue'), 'line', array_values($amounts['overdue']))
->backgroundColor('#ef3232')
->color('#ef3232')
->options([
'borderWidth' => 4,
'pointStyle' => 'line',
])
->fill(false);
$date_picker_shortcuts = $this->getDatePickerShortcuts();
if (!request()->has('start_date')) {
request()->merge(['start_date' => $date_picker_shortcuts[trans('reports.this_year')]['start']]);
request()->merge(['end_date' => $date_picker_shortcuts[trans('reports.this_year')]['end']]);
}
return view('portal.dashboard.index', compact('contact', 'invoices', 'totals', 'progress', 'chart', 'date_picker_shortcuts'));
return view('portal.dashboard.index', compact('contact', 'invoices'));
}
private function calculateAmounts($invoices, $start, $end)

View File

@ -5,7 +5,6 @@ namespace App\Http\Controllers\Portal;
use App\Abstracts\Http\Controller;
use App\Http\Requests\Portal\InvoiceShow as Request;
use App\Models\Document\Document;
use App\Models\Setting\Category;
use App\Traits\Currencies;
use App\Traits\DateTime;
use App\Traits\Documents;
@ -33,11 +32,7 @@ class Invoices extends Controller
->accrued()->where('contact_id', user()->contact->id)
->collect(['document_number'=> 'desc']);
$categories = collect(Category::income()->enabled()->orderBy('name')->pluck('name', 'id'));
$statuses = $this->getDocumentStatuses(Document::INVOICE_TYPE);
return $this->response('portal.invoices.index', compact('invoices', 'categories', 'statuses'));
return $this->response('portal.invoices.index', compact('invoices'));
}
/**
@ -56,6 +51,20 @@ class Invoices extends Controller
return view('portal.invoices.show', compact('invoice', 'payment_methods'));
}
/**
* Show the form for viewing the specified resource.
*
* @param Document $invoice
*
* @return Response
*/
public function finish(Document $invoice, Request $request)
{
$layout = $request->isPortal($invoice->company_id) ? 'portal' : 'signed';
return view('portal.invoices.finish', compact('invoice', 'layout'));
}
/**
* Show the form for viewing the specified resource.
*
@ -98,6 +107,27 @@ class Invoices extends Controller
return $pdf->download($file_name);
}
public function preview(Document $invoice)
{
if (empty($invoice)) {
return redirect()->route('login');
}
$payment_actions = [];
$payment_methods = Modules::getPaymentMethods();
foreach ($payment_methods as $payment_method_key => $payment_method_value) {
$codes = explode('.', $payment_method_key);
if (!isset($payment_actions[$codes[0]])) {
$payment_actions[$codes[0]] = URL::signedRoute('signed.' . $codes[0] . '.invoices.show', [$invoice->id]);
}
}
return view('portal.invoices.preview', compact('invoice', 'payment_methods', 'payment_actions'));
}
public function signed(Document $invoice)
{
if (empty($invoice)) {
@ -119,7 +149,10 @@ class Invoices extends Controller
$print_action = URL::signedRoute('signed.invoices.print', [$invoice->id]);
$pdf_action = URL::signedRoute('signed.invoices.pdf', [$invoice->id]);
event(new \App\Events\Document\DocumentViewed($invoice));
// Guest or Invoice contact user track the invoice viewed.
if (empty(user()) || user()->id == $invoice->contact->user_id) {
event(new \App\Events\Document\DocumentViewed($invoice));
}
return view('portal.invoices.signed', compact('invoice', 'payment_methods', 'payment_actions', 'print_action', 'pdf_action'));
}

View File

@ -3,6 +3,7 @@
namespace App\Http\Controllers\Portal;
use App\Abstracts\Http\Controller;
use App\Events\Banking\TransactionPrinting;
use App\Models\Banking\Transaction;
use App\Models\Setting\Currency;
use App\Http\Requests\Portal\PaymentShow as Request;
@ -65,10 +66,10 @@ class Payments extends Controller
*/
public function printPayment(Transaction $payment, Request $request)
{
event(new \App\Events\Banking\TransactionPrinting($payment));
event(new TransactionPrinting($payment));
$revenue = $payment;
$view = view($payment->template_path, compact('revenue'));
$transaction = $payment;
$view = view('banking.transactions.print_default', compact('transaction'));
return mb_convert_encoding($view, 'HTML-ENTITIES', 'UTF-8');
}
@ -82,12 +83,12 @@ class Payments extends Controller
*/
public function pdfPayment(Transaction $payment, Request $request)
{
event(new \App\Events\Banking\TransactionPrinting($payment));
event(new TransactionPrinting($payment));
$currency_style = true;
$revenue = $payment;
$view = view($payment->template_path, compact('revenue', 'currency_style'))->render();
$transaction = $payment;
$view = view('banking.transactions.print_default', compact('transaction', 'currency_style'))->render();
$html = mb_convert_encoding($view, 'HTML-ENTITIES', 'UTF-8');
$pdf = app('dompdf.wrapper');
@ -100,6 +101,15 @@ class Payments extends Controller
return $pdf->download($file_name);
}
public function preview(Transaction $payment)
{
if (empty($payment)) {
return redirect()->route('login');
}
return view('portal.payments.preview', compact('payment'));
}
public function signed(Transaction $payment)
{
if (empty($payment)) {

View File

@ -47,6 +47,7 @@ class Profile extends Controller
// Do not reset password if not entered/changed
if (empty($request['password'])) {
unset($request['current_password']);
unset($request['password']);
unset($request['password_confirmation']);
}

View File

@ -13,9 +13,7 @@ use App\Jobs\Document\DeleteDocument;
use App\Jobs\Document\DuplicateDocument;
use App\Jobs\Document\UpdateDocument;
use App\Models\Document\Document;
use App\Models\Setting\Currency;
use App\Traits\Documents;
use File;
class Bills extends Controller
{
@ -283,30 +281,6 @@ class Bills extends Controller
return $pdf->download($file_name);
}
/**
* Mark the bill as paid.
*
* @param Document $bill
*
* @return Response
*/
public function markPaid(Document $bill)
{
try {
$this->dispatch(new CreateBankingDocumentTransaction($bill, ['type' => 'expense']));
$message = trans('documents.messages.marked_paid', ['type' => trans_choice('general.bills', 1)]);
flash($message)->success();
} catch(\Exception $e) {
$message = $e->getMessage();
flash($message)->error()->important();
}
return redirect()->back();
}
protected function prepareBill(Document $bill)
{
$paid = 0;

View File

@ -1,326 +0,0 @@
<?php
namespace App\Http\Controllers\Purchases;
use App\Abstracts\Http\Controller;
use App\Exports\Purchases\Payments as Export;
use App\Http\Requests\Banking\Transaction as Request;
use App\Http\Requests\Common\Import as ImportRequest;
use App\Imports\Purchases\Payments as Import;
use App\Jobs\Banking\CreateTransaction;
use App\Jobs\Banking\DeleteTransaction;
use App\Jobs\Banking\UpdateTransaction;
use App\Models\Banking\Account;
use App\Models\Banking\Transaction;
use App\Models\Common\Contact;
use App\Models\Setting\Category;
use App\Models\Setting\Currency;
use App\Traits\Currencies;
use App\Traits\DateTime;
use App\Traits\Transactions;
use App\Utilities\Modules;
class Payments extends Controller
{
use Currencies, DateTime, Transactions;
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
$payments = Transaction::with('account', 'bill', 'category', 'contact')->expense()->isNotTransfer()->collect(['paid_at'=> 'desc']);
return $this->response('purchases.payments.index', compact('payments'));
}
/**
* Show the form for viewing the specified resource.
*
* @return Response
*/
public function show(Transaction $payment)
{
return view('purchases.payments.show', compact('payment'));
}
/**
* Show the form for creating a new resource.
*
* @return Response
*/
public function create()
{
$accounts = Account::enabled()->orderBy('name')->pluck('name', 'id');
$currencies = Currency::enabled()->orderBy('name')->pluck('name', 'code')->toArray();
$account_currency_code = Account::where('id', setting('default.account'))->pluck('currency_code')->first();
$currency = Currency::where('code', $account_currency_code)->first();
$vendors = Contact::vendor()->enabled()->orderBy('name')->take(setting('default.select_limit'))->pluck('name', 'id');
$categories = Category::expense()->enabled()->orderBy('name')->take(setting('default.select_limit'))->pluck('name', 'id');
$payment_methods = Modules::getPaymentMethods();
$file_type_mimes = explode(',', config('filesystems.mimes'));
$file_types = [];
foreach ($file_type_mimes as $mime) {
$file_types[] = '.' . $mime;
}
$file_types = implode(',', $file_types);
return view('purchases.payments.create', compact('accounts', 'currencies', 'account_currency_code', 'currency', 'vendors', 'categories', 'payment_methods', 'file_types'));
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
*
* @return Response
*/
public function store(Request $request)
{
$response = $this->ajaxDispatch(new CreateTransaction($request));
if ($response['success']) {
$response['redirect'] = route('payments.show', $response['data']->id);
$message = trans('messages.success.added', ['type' => trans_choice('general.payments', 1)]);
flash($message)->success();
} else {
$response['redirect'] = route('payments.create');
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
/**
* Duplicate the specified resource.
*
* @param Transaction $payment
*
* @return Response
*/
public function duplicate(Transaction $payment)
{
$clone = $payment->duplicate();
$message = trans('messages.success.duplicated', ['type' => trans_choice('general.payments', 1)]);
flash($message)->success();
return redirect()->route('payments.edit', $clone->id);
}
/**
* Import the specified resource.
*
* @param ImportRequest $request
*
* @return Response
*/
public function import(ImportRequest $request)
{
$response = $this->importExcel(new Import, $request, trans_choice('general.payments', 2));
if ($response['success']) {
$response['redirect'] = route('payments.index');
flash($response['message'])->success();
} else {
$response['redirect'] = route('import.create', ['purchases', 'payments']);
flash($response['message'])->error()->important();
}
return response()->json($response);
}
/**
* Show the form for editing the specified resource.
*
* @param Transaction $payment
*
* @return Response
*/
public function edit(Transaction $payment)
{
$accounts = Account::enabled()->orderBy('name')->pluck('name', 'id');
$currencies = Currency::enabled()->orderBy('name')->pluck('name', 'code')->toArray();
$currency = Currency::where('code', $payment->currency_code)->first();
$vendors = Contact::vendor()->enabled()->orderBy('name')->take(setting('default.select_limit'))->pluck('name', 'id');
if ($payment->contact && !$vendors->has($payment->contact_id)) {
$vendors->put($payment->contact->id, $payment->contact->name);
}
$categories = Category::expense()->enabled()->orderBy('name')->take(setting('default.select_limit'))->pluck('name', 'id');
if ($payment->category && !$categories->has($payment->category_id)) {
$categories->put($payment->category->id, $payment->category->name);
}
$payment_methods = Modules::getPaymentMethods();
$date_format = $this->getCompanyDateFormat();
$file_type_mimes = explode(',', config('filesystems.mimes'));
$file_types = [];
foreach ($file_type_mimes as $mime) {
$file_types[] = '.' . $mime;
}
$file_types = implode(',', $file_types);
return view('purchases.payments.edit', compact('payment', 'accounts', 'currencies', 'currency', 'vendors', 'categories', 'payment_methods', 'date_format', 'file_types'));
}
/**
* Update the specified resource in storage.
*
* @param Transaction $payment
* @param Request $request
*
* @return Response
*/
public function update(Transaction $payment, Request $request)
{
$response = $this->ajaxDispatch(new UpdateTransaction($payment, $request));
if ($response['success']) {
$response['redirect'] = route('payments.show', $payment->id);
$message = trans('messages.success.updated', ['type' => trans_choice('general.payments', 1)]);
flash($message)->success();
} else {
$response['redirect'] = route('payments.edit', $payment->id);
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
/**
* Remove the specified resource from storage.
*
* @param Transaction $payment
*
* @return Response
*/
public function destroy(Transaction $payment)
{
$response = $this->ajaxDispatch(new DeleteTransaction($payment));
$response['redirect'] = route('payments.index');
if ($response['success']) {
$message = trans('messages.success.deleted', ['type' => trans_choice('general.payments', 1)]);
flash($message)->success();
} else {
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
/**
* Export the specified resource.
*
* @return Response
*/
public function export()
{
return $this->exportExcel(new Export, trans_choice('general.payments', 2));
}
/**
* Download the PDF file of payment.
*
* @param Transaction $payment
*
* @return Response
*/
public function emailPayment(Transaction $payment)
{
if (empty($payment->contact->email)) {
return redirect()->back();
}
// Notify the customer
$payment->contact->notify(new Notification($payment, 'payment_new_customer', true));
event(new \App\Events\Banking\TransactionSent($payment));
flash(trans('documents.messages.email_sent', ['type' => trans_choice('general.payments', 1)]))->success();
return redirect()->back();
}
/**
* Print the payment.
*
* @param Transaction $payment
*
* @return Response
*/
public function printPayment(Transaction $payment)
{
event(new \App\Events\Banking\TransactionPrinting($payment));
$view = view($payment->template_path, compact('payment'));
return mb_convert_encoding($view, 'HTML-ENTITIES', 'UTF-8');
}
/**
* Download the PDF file of payment.
*
* @param Transaction $payment
*
* @return Response
*/
public function pdfPayment(Transaction $payment)
{
event(new \App\Events\Banking\TransactionPrinting($payment));
$currency_style = true;
$view = view($payment->template_path, compact('payment', 'currency_style'))->render();
$html = mb_convert_encoding($view, 'HTML-ENTITIES', 'UTF-8');
$pdf = app('dompdf.wrapper');
$pdf->loadHTML($html);
//$pdf->setPaper('A4', 'portrait');
$file_name = $this->getTransactionFileName($payment);
return $pdf->download($file_name);
}
}

View File

@ -0,0 +1,189 @@
<?php
namespace App\Http\Controllers\Purchases;
use App\Abstracts\Http\Controller;
use App\Http\Requests\Document\Document as Request;
use App\Jobs\Document\CreateDocument;
use App\Jobs\Document\DuplicateDocument;
use App\Jobs\Document\UpdateDocument;
use App\Models\Common\Recurring;
use App\Models\Document\Document;
use App\Traits\Documents;
class RecurringBills extends Controller
{
use Documents;
/**
* @var string
*/
public $type = Document::BILL_RECURRING_TYPE;
/**
* Instantiate a new controller instance.
*/
public function __construct()
{
// Add CRUD permission check
$this->middleware('permission:create-purchases-bills')->only('create', 'store', 'duplicate', 'import');
$this->middleware('permission:read-purchases-bills')->only('index', 'show', 'edit', 'export');
$this->middleware('permission:update-purchases-bills')->only('update', 'enable', 'disable');
$this->middleware('permission:delete-purchases-bills')->only('destroy');
}
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
$bills = Document::with('contact', 'transactions', 'recurring')->billRecurring()->collect(['issued_at' => 'desc']);
return $this->response('purchases.recurring_bills.index', compact('bills'));
}
/**
* Show the form for viewing the specified resource.
*
* @param Document $recurring_bill
*
* @return Response
*/
public function show(Document $recurring_bill)
{
$recurring_bill->load(['category', 'recurring', 'children']);
return view('purchases.recurring_bills.show', compact('recurring_bill'));
}
/**
* Show the form for creating a new resource.
*
* @return Response
*/
public function create()
{
return view('purchases.recurring_bills.create');
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
*
* @return Response
*/
public function store(Request $request)
{
$response = $this->ajaxDispatch(new CreateDocument($request->merge(['issued_at' => $request->get('recurring_started_at')])));
if ($response['success']) {
$response['redirect'] = route('recurring-bills.show', $response['data']->id);
$message = trans('messages.success.added', ['type' => trans_choice('general.recurring_bills', 1)]);
flash($message)->success();
} else {
$response['redirect'] = route('recurring-bills.create');
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
/**
* Duplicate the specified resource.
*
* @param Document $recurring_bill
*
* @return Response
*/
public function duplicate(Document $recurring_bill)
{
$clone = $this->dispatch(new DuplicateDocument($recurring_bill));
$message = trans('messages.success.duplicated', ['type' => trans_choice('general.recurring_bills', 1)]);
flash($message)->success();
return redirect()->route('recurring-bills.edit', $clone->id);
}
/**
* Show the form for editing the specified resource.
*
* @param Document $recurring_bill
*
* @return Response
*/
public function edit(Document $recurring_bill)
{
return view('purchases.recurring_bills.edit', compact('recurring_bill'));
}
/**
* Update the specified resource in storage.
*
* @param Document $recurring_bill
* @param Request $request
*
* @return Response
*/
public function update(Document $recurring_bill, Request $request)
{
$response = $this->ajaxDispatch(new UpdateDocument($recurring_bill, $request->merge(['issued_at' => $request->get('recurring_started_at')])));
if ($response['success']) {
$response['redirect'] = route('recurring-bills.show', $response['data']->id);
$message = trans('messages.success.updated', ['type' => trans_choice('general.recurring_bills', 1)]);
flash($message)->success();
} else {
$response['redirect'] = route('recurring-bills.edit', $recurring_bill->id);
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
/**
* End recurring template.
*
* @return Response
*/
public function end(Document $recurring_bill)
{
$response = $this->ajaxDispatch(new UpdateDocument($recurring_bill, [
'recurring_frequency' => $recurring_bill->recurring->frequency,
'recurring_interval' => $recurring_bill->recurring->interval,
'recurring_started_at' => $recurring_bill->recurring->started_at,
'recurring_limit' => $recurring_bill->recurring->limit,
'recurring_limit_count' => $recurring_bill->recurring->limit_count,
'recurring_limit_date' => $recurring_bill->recurring->limit_date,
'created_from' => $recurring_bill->created_from,
'created_by' => $recurring_bill->created_by,
'recurring_status' => Recurring::END_STATUS,
]));
if ($response['success']) {
$message = trans('messages.success.ended', ['type' => trans_choice('general.recurring_bills', 1)]);
flash($message)->success();
} else {
$message = $response['message'];
flash($message)->error()->important();
}
return redirect()->route('recurring-bills.index');
}
}

View File

@ -9,11 +9,11 @@ use App\Http\Requests\Common\Import as ImportRequest;
use App\Imports\Purchases\Vendors as Import;
use App\Jobs\Common\CreateContact;
use App\Jobs\Common\DeleteContact;
use App\Jobs\Common\DuplicateContact;
use App\Jobs\Common\UpdateContact;
use App\Models\Banking\Transaction;
use App\Models\Common\Contact;
use App\Models\Document\Document;
use App\Models\Setting\Currency;
use App\Traits\Contacts;
use App\Utilities\Date;
@ -21,6 +21,11 @@ class Vendors extends Controller
{
use Contacts;
/**
* @var string
*/
public $type = Contact::VENDOR_TYPE;
/**
* Display a listing of the resource.
*
@ -42,56 +47,7 @@ class Vendors extends Controller
*/
public function show(Contact $vendor)
{
$amounts = [
'paid' => 0,
'open' => 0,
'overdue' => 0,
];
$counts = [];
// Handle bills
$bills = Document::bill()->with('transactions')->where('contact_id', $vendor->id)->get();
$counts['bills'] = $bills->count();
$today = Date::today()->toDateString();
foreach ($bills as $item) {
// Already in transactions
if ($item->status == 'paid' || $item->status == 'cancelled') {
continue;
}
$transactions = 0;
foreach ($item->transactions as $transaction) {
$transactions += $transaction->getAmountConvertedToDefault();
}
// Check if it's open or overdue invoice
if ($item->due_at > $today) {
$amounts['open'] += $item->getAmountConvertedToDefault() - $transactions;
} else {
$amounts['overdue'] += $item->getAmountConvertedToDefault() - $transactions;
}
}
// Handle payments
$transactions = Transaction::with('account', 'category')->where('contact_id', $vendor->id)->expense()->get();
$counts['transactions'] = $transactions->count();
// Prepare data
$transactions->each(function ($item) use (&$amounts) {
$amounts['paid'] += $item->getAmountConvertedToDefault();
});
$limit = (int) request('limit', setting('default.list_limit', '25'));
$transactions = $this->paginate($transactions->sortByDesc('paid_at'), $limit);
$bills = $this->paginate($bills->sortByDesc('issued_at'), $limit);
return view('purchases.vendors.show', compact('vendor', 'counts', 'amounts', 'transactions', 'bills'));
return view('purchases.vendors.show', compact('vendor'));
}
/**
@ -101,9 +57,7 @@ class Vendors extends Controller
*/
public function create()
{
$currencies = Currency::enabled()->pluck('name', 'code');
return view('purchases.vendors.create', compact('currencies'));
return view('purchases.vendors.create');
}
/**
@ -143,7 +97,7 @@ class Vendors extends Controller
*/
public function duplicate(Contact $vendor)
{
$clone = $vendor->duplicate();
$clone = $this->dispatch(new DuplicateContact($vendor));
$message = trans('messages.success.duplicated', ['type' => trans_choice('general.vendors', 1)]);
@ -185,9 +139,7 @@ class Vendors extends Controller
*/
public function edit(Contact $vendor)
{
$currencies = Currency::enabled()->pluck('name', 'code');
return view('purchases.vendors.edit', compact('vendor', 'currencies'));
return view('purchases.vendors.edit', compact('vendor'));
}
/**
@ -298,10 +250,10 @@ class Vendors extends Controller
return redirect()->route('bills.create')->withInput($data);
}
public function createPayment(Contact $vendor)
public function createExpense(Contact $vendor)
{
$data['contact'] = $vendor;
return redirect()->route('payments.create')->withInput($data);
return redirect()->route('transactions.create', ['type' => 'expense'])->withInput($data);
}
}

View File

@ -9,15 +9,23 @@ use App\Http\Requests\Common\Import as ImportRequest;
use App\Imports\Sales\Customers as Import;
use App\Jobs\Common\CreateContact;
use App\Jobs\Common\DeleteContact;
use App\Jobs\Common\DuplicateContact;
use App\Jobs\Common\UpdateContact;
use App\Models\Banking\Transaction;
use App\Models\Common\Contact;
use App\Models\Document\Document;
use App\Models\Setting\Currency;
use App\Traits\Contacts;
use App\Utilities\Date;
class Customers extends Controller
{
use Contacts;
/**
* @var string
*/
public $type = Contact::CUSTOMER_TYPE;
/**
* Display a listing of the resource.
*
@ -25,7 +33,7 @@ class Customers extends Controller
*/
public function index()
{
$customers = Contact::with('invoices.transactions')->customer()->collect();
$customers = Contact::customer()->with('invoices.transactions')->collect();
return $this->response('sales.customers.index', compact('customers'));
}
@ -39,56 +47,7 @@ class Customers extends Controller
*/
public function show(Contact $customer)
{
$amounts = [
'paid' => 0,
'open' => 0,
'overdue' => 0,
];
$counts = [];
// Handle invoices
$invoices = Document::invoice()->with('transactions')->where('contact_id', $customer->id)->get();
$counts['invoices'] = $invoices->count();
$today = Date::today()->toDateString();
foreach ($invoices as $item) {
// Already in transactions
if ($item->status == 'paid' || $item->status == 'cancelled') {
continue;
}
$transactions = 0;
foreach ($item->transactions as $transaction) {
$transactions += $transaction->getAmountConvertedToDefault();
}
// Check if it's open or overdue invoice
if ($item->due_at > $today) {
$amounts['open'] += $item->getAmountConvertedToDefault() - $transactions;
} else {
$amounts['overdue'] += $item->getAmountConvertedToDefault() - $transactions;
}
}
// Handle transactions
$transactions = Transaction::with('account', 'category')->where('contact_id', $customer->id)->income()->get();
$counts['transactions'] = $transactions->count();
// Prepare data
$transactions->each(function ($item) use (&$amounts) {
$amounts['paid'] += $item->getAmountConvertedToDefault();
});
$limit = (int) request('limit', setting('default.list_limit', '25'));
$transactions = $this->paginate($transactions->sortByDesc('paid_at'), $limit);
$invoices = $this->paginate($invoices->sortByDesc('issued_at'), $limit);
return view('sales.customers.show', compact('customer', 'counts', 'amounts', 'transactions', 'invoices'));
return view('sales.customers.show', compact('customer'));
}
/**
@ -98,9 +57,7 @@ class Customers extends Controller
*/
public function create()
{
$currencies = Currency::enabled()->pluck('name', 'code');
return view('sales.customers.create', compact('currencies'));
return view('sales.customers.create');
}
/**
@ -140,7 +97,7 @@ class Customers extends Controller
*/
public function duplicate(Contact $customer)
{
$clone = $customer->duplicate();
$clone = $this->dispatch(new DuplicateContact($customer));
$message = trans('messages.success.duplicated', ['type' => trans_choice('general.customers', 1)]);
@ -182,9 +139,7 @@ class Customers extends Controller
*/
public function edit(Contact $customer)
{
$currencies = Currency::enabled()->pluck('name', 'code');
return view('sales.customers.edit', compact('customer', 'currencies'));
return view('sales.customers.edit', compact('customer'));
}
/**
@ -295,10 +250,10 @@ class Customers extends Controller
return redirect()->route('invoices.create')->withInput($data);
}
public function createRevenue(Contact $customer)
public function createIncome(Contact $customer)
{
$data['contact'] = $customer;
return redirect()->route('revenues.create')->withInput($data);
return redirect()->route('transactions.create', ['type' => 'income'])->withInput($data);
}
}

View File

@ -288,13 +288,13 @@ class Invoices extends Controller
* @return Response
*/
public function pdfInvoice(Document $invoice)
{
{
event(new \App\Events\Document\DocumentPrinting($invoice));
$currency_style = true;
$view = view($invoice->template_path, compact('invoice', 'currency_style'))->render();
$html = mb_convert_encoding($view, 'HTML-ENTITIES', 'UTF-8');
$pdf = app('dompdf.wrapper');
@ -306,28 +306,4 @@ class Invoices extends Controller
return $pdf->download($file_name);
}
/**
* Mark the invoice as paid.
*
* @param Document $invoice
*
* @return Response
*/
public function markPaid(Document $invoice)
{
try {
event(new \App\Events\Document\PaymentReceived($invoice, ['type' => 'income', 'mark_paid' => 'invoice']));
$message = trans('documents.messages.marked_paid', ['type' => trans_choice('general.invoices', 1)]);
flash($message)->success();
} catch(\Exception $e) {
$message = $e->getMessage();
flash($message)->error()->important();
}
return redirect()->back();
}
}

View File

@ -0,0 +1,189 @@
<?php
namespace App\Http\Controllers\Sales;
use App\Abstracts\Http\Controller;
use App\Http\Requests\Document\Document as Request;
use App\Jobs\Document\CreateDocument;
use App\Jobs\Document\DuplicateDocument;
use App\Jobs\Document\UpdateDocument;
use App\Models\Common\Recurring;
use App\Models\Document\Document;
use App\Traits\Documents;
class RecurringInvoices extends Controller
{
use Documents;
/**
* @var string
*/
public $type = Document::INVOICE_RECURRING_TYPE;
/**
* Instantiate a new controller instance.
*/
public function __construct()
{
// Add CRUD permission check
$this->middleware('permission:create-sales-invoices')->only('create', 'store', 'duplicate', 'import');
$this->middleware('permission:read-sales-invoices')->only('index', 'show', 'edit', 'export');
$this->middleware('permission:update-sales-invoices')->only('update', 'enable', 'disable');
$this->middleware('permission:delete-sales-invoices')->only('destroy');
}
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
$invoices = Document::with('contact', 'transactions', 'recurring')->invoiceRecurring()->collect(['issued_at' => 'desc']);
return $this->response('sales.recurring_invoices.index', compact('invoices'));
}
/**
* Show the form for viewing the specified resource.
*
* @param Document $recurring_invoice
*
* @return Response
*/
public function show(Document $recurring_invoice)
{
$recurring_invoice->load(['category', 'recurring', 'children']);
return view('sales.recurring_invoices.show', compact('recurring_invoice'));
}
/**
* Show the form for creating a new resource.
*
* @return Response
*/
public function create()
{
return view('sales.recurring_invoices.create');
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
*
* @return Response
*/
public function store(Request $request)
{
$response = $this->ajaxDispatch(new CreateDocument($request->merge(['issued_at' => $request->get('recurring_started_at')])));
if ($response['success']) {
$response['redirect'] = route('recurring-invoices.show', $response['data']->id);
$message = trans('messages.success.added', ['type' => trans_choice('general.recurring_invoices', 1)]);
flash($message)->success();
} else {
$response['redirect'] = route('recurring-invoices.create');
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
/**
* Duplicate the specified resource.
*
* @param Document $recurring_invoice
*
* @return Response
*/
public function duplicate(Document $recurring_invoice)
{
$clone = $this->dispatch(new DuplicateDocument($recurring_invoice));
$message = trans('messages.success.duplicated', ['type' => trans_choice('general.recurring_invoices', 1)]);
flash($message)->success();
return redirect()->route('recurring-invoices.edit', $clone->id);
}
/**
* Show the form for editing the specified resource.
*
* @param Document $recurring_invoice
*
* @return Response
*/
public function edit(Document $recurring_invoice)
{
return view('sales.recurring_invoices.edit', compact('recurring_invoice'));
}
/**
* Update the specified resource in storage.
*
* @param Document $recurring_invoice
* @param Request $request
*
* @return Response
*/
public function update(Document $recurring_invoice, Request $request)
{
$response = $this->ajaxDispatch(new UpdateDocument($recurring_invoice, $request->merge(['issued_at' => $request->get('recurring_started_at')])));
if ($response['success']) {
$response['redirect'] = route('recurring-invoices.show', $response['data']->id);
$message = trans('messages.success.updated', ['type' => trans_choice('general.recurring_invoices', 1)]);
flash($message)->success();
} else {
$response['redirect'] = route('recurring-invoices.edit', $recurring_invoice->id);
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
/**
* End recurring template.
*
* @return Response
*/
public function end(Document $recurring_invoice)
{
$response = $this->ajaxDispatch(new UpdateDocument($recurring_invoice, [
'recurring_frequency' => $recurring_invoice->recurring->frequency,
'recurring_interval' => $recurring_invoice->recurring->interval,
'recurring_started_at' => $recurring_invoice->recurring->started_at,
'recurring_limit' => $recurring_invoice->recurring->limit,
'recurring_limit_count' => $recurring_invoice->recurring->limit_count,
'recurring_limit_date' => $recurring_invoice->recurring->limit_date,
'created_from' => $recurring_invoice->created_from,
'created_by' => $recurring_invoice->created_by,
'recurring_status' => Recurring::END_STATUS,
]));
if ($response['success']) {
$message = trans('messages.success.ended', ['type' => trans_choice('general.recurring_invoices', 1)]);
flash($message)->success();
} else {
$message = $response['message'];
flash($message)->error()->important();
}
return redirect()->route('recurring-invoices.index');
}
}

View File

@ -1,327 +0,0 @@
<?php
namespace App\Http\Controllers\Sales;
use App\Abstracts\Http\Controller;
use App\Exports\Sales\Revenues as Export;
use App\Http\Requests\Banking\Transaction as Request;
use App\Http\Requests\Common\Import as ImportRequest;
use App\Imports\Sales\Revenues as Import;
use App\Jobs\Banking\CreateTransaction;
use App\Jobs\Banking\DeleteTransaction;
use App\Jobs\Banking\UpdateTransaction;
use App\Models\Banking\Account;
use App\Models\Banking\Transaction;
use App\Models\Common\Contact;
use App\Models\Setting\Category;
use App\Models\Setting\Currency;
use App\Notifications\Sale\Revenue as Notification;
use App\Traits\Currencies;
use App\Traits\DateTime;
use App\Traits\Transactions;
use App\Utilities\Modules;
class Revenues extends Controller
{
use Currencies, DateTime, Transactions;
/**
* Display a listing of the resource.
*
* @return Response
*/
public function index()
{
$revenues = Transaction::with('account', 'category', 'contact', 'invoice')->income()->isNotTransfer()->collect(['paid_at'=> 'desc']);
return $this->response('sales.revenues.index', compact('revenues'));
}
/**
* Show the form for viewing the specified resource.
*
* @return Response
*/
public function show(Transaction $revenue)
{
return view('sales.revenues.show', compact('revenue'));
}
/**
* Show the form for creating a new resource.
*
* @return Response
*/
public function create()
{
$accounts = Account::enabled()->orderBy('name')->pluck('name', 'id');
$currencies = Currency::enabled()->orderBy('name')->pluck('name', 'code')->toArray();
$account_currency_code = Account::where('id', setting('default.account'))->pluck('currency_code')->first();
$currency = Currency::where('code', $account_currency_code)->first();
$customers = Contact::customer()->enabled()->orderBy('name')->take(setting('default.select_limit'))->pluck('name', 'id');
$categories = Category::income()->enabled()->orderBy('name')->take(setting('default.select_limit'))->pluck('name', 'id');
$payment_methods = Modules::getPaymentMethods();
$file_type_mimes = explode(',', config('filesystems.mimes'));
$file_types = [];
foreach ($file_type_mimes as $mime) {
$file_types[] = '.' . $mime;
}
$file_types = implode(',', $file_types);
return view('sales.revenues.create', compact('accounts', 'currencies', 'account_currency_code', 'currency', 'customers', 'categories', 'payment_methods', 'file_types'));
}
/**
* Store a newly created resource in storage.
*
* @param Request $request
*
* @return Response
*/
public function store(Request $request)
{
$response = $this->ajaxDispatch(new CreateTransaction($request));
if ($response['success']) {
$response['redirect'] = route('revenues.show', $response['data']->id);
$message = trans('messages.success.added', ['type' => trans_choice('general.revenues', 1)]);
flash($message)->success();
} else {
$response['redirect'] = route('revenues.create');
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
/**
* Duplicate the specified resource.
*
* @param Transaction $revenue
*
* @return Response
*/
public function duplicate(Transaction $revenue)
{
$clone = $revenue->duplicate();
$message = trans('messages.success.duplicated', ['type' => trans_choice('general.revenues', 1)]);
flash($message)->success();
return redirect()->route('revenues.edit', $clone->id);
}
/**
* Import the specified resource.
*
* @param ImportRequest $request
*
* @return Response
*/
public function import(ImportRequest $request)
{
$response = $this->importExcel(new Import, $request, trans_choice('general.revenues', 2));
if ($response['success']) {
$response['redirect'] = route('revenues.index');
flash($response['message'])->success();
} else {
$response['redirect'] = route('import.create', ['sales', 'revenues']);
flash($response['message'])->error()->important();
}
return response()->json($response);
}
/**
* Show the form for editing the specified resource.
*
* @param Transaction $revenue
*
* @return Response
*/
public function edit(Transaction $revenue)
{
$accounts = Account::enabled()->orderBy('name')->pluck('name', 'id');
$currencies = Currency::enabled()->orderBy('name')->pluck('name', 'code')->toArray();
$currency = Currency::where('code', $revenue->currency_code)->first();
$customers = Contact::customer()->enabled()->orderBy('name')->take(setting('default.select_limit'))->pluck('name', 'id');
if ($revenue->contact && !$customers->has($revenue->contact_id)) {
$customers->put($revenue->contact->id, $revenue->contact->name);
}
$categories = Category::income()->enabled()->orderBy('name')->take(setting('default.select_limit'))->pluck('name', 'id');
if ($revenue->category && !$categories->has($revenue->category_id)) {
$categories->put($revenue->category->id, $revenue->category->name);
}
$payment_methods = Modules::getPaymentMethods();
$date_format = $this->getCompanyDateFormat();
$file_type_mimes = explode(',', config('filesystems.mimes'));
$file_types = [];
foreach ($file_type_mimes as $mime) {
$file_types[] = '.' . $mime;
}
$file_types = implode(',', $file_types);
return view('sales.revenues.edit', compact('revenue', 'accounts', 'currencies', 'currency', 'customers', 'categories', 'payment_methods', 'date_format', 'file_types'));
}
/**
* Update the specified resource in storage.
*
* @param Transaction $revenue
* @param Request $request
*
* @return Response
*/
public function update(Transaction $revenue, Request $request)
{
$response = $this->ajaxDispatch(new UpdateTransaction($revenue, $request));
if ($response['success']) {
$response['redirect'] = route('revenues.show', $revenue->id);
$message = trans('messages.success.updated', ['type' => trans_choice('general.revenues', 1)]);
flash($message)->success();
} else {
$response['redirect'] = route('revenues.edit', $revenue->id);
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
/**
* Remove the specified resource from storage.
*
* @param Transaction $revenue
*
* @return Response
*/
public function destroy(Transaction $revenue)
{
$response = $this->ajaxDispatch(new DeleteTransaction($revenue));
$response['redirect'] = route('revenues.index');
if ($response['success']) {
$message = trans('messages.success.deleted', ['type' => trans_choice('general.revenues', 1)]);
flash($message)->success();
} else {
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
/**
* Export the specified resource.
*
* @return Response
*/
public function export()
{
return $this->exportExcel(new Export, trans_choice('general.revenues', 2));
}
/**
* Download the PDF file of revenue.
*
* @param Transaction $revenue
*
* @return Response
*/
public function emailRevenue(Transaction $revenue)
{
if (empty($revenue->contact->email)) {
return redirect()->back();
}
// Notify the customer
$revenue->contact->notify(new Notification($revenue, 'revenue_new_customer', true));
event(new \App\Events\Banking\TransactionSent($revenue));
flash(trans('documents.messages.email_sent', ['type' => trans_choice('general.revenues', 1)]))->success();
return redirect()->back();
}
/**
* Print the revenue.
*
* @param Transaction $revenue
*
* @return Response
*/
public function printRevenue(Transaction $revenue)
{
event(new \App\Events\Banking\TransactionPrinting($revenue));
$view = view($revenue->template_path, compact('revenue'));
return mb_convert_encoding($view, 'HTML-ENTITIES', 'UTF-8');
}
/**
* Download the PDF file of revenue.
*
* @param Transaction $revenue
*
* @return Response
*/
public function pdfRevenue(Transaction $revenue)
{
event(new \App\Events\Banking\TransactionPrinting($revenue));
$currency_style = true;
$view = view($revenue->template_path, compact('revenue', 'currency_style'))->render();
$html = mb_convert_encoding($view, 'HTML-ENTITIES', 'UTF-8');
$pdf = app('dompdf.wrapper');
$pdf->loadHTML($html);
//$pdf->setPaper('A4', 'portrait');
$file_name = $this->getTransactionFileName($revenue);
return $pdf->download($file_name);
}
}

View File

@ -24,7 +24,7 @@ class Categories extends Controller
*/
public function index()
{
$categories = Category::collect();
$categories = Category::with('sub_categories')->collect();
$transfer_id = Category::transfer();
@ -52,7 +52,21 @@ class Categories extends Controller
{
$types = $this->getCategoryTypes();
return view('settings.categories.create', compact('types'));
$categories = [];
foreach (config('type.category') as $type => $config) {
$categories[$type] = [];
}
Category::enabled()->orderBy('name')->get()->each(function ($category) use (&$categories) {
$categories[$category->type][] = [
'id' => $category->id,
'title' => $category->name,
'level' => $category->level,
];
});
return view('settings.categories.create', compact('types', 'categories'));
}
/**
@ -120,7 +134,25 @@ class Categories extends Controller
$type_disabled = (Category::where('type', $category->type)->count() == 1) ?: false;
return view('settings.categories.edit', compact('category', 'types', 'type_disabled'));
$edited_category_id = $category->id;
$categories = [];
foreach (config('type.category') as $type => $config) {
$categories[$type] = [];
}
Category::enabled()->orderBy('name')->get()->each(function ($category) use (&$categories, $edited_category_id) {
if ($edited_category_id != $category->id) {
$categories[$category->type][] = [
'id' => $category->id,
'title' => $category->name,
'level' => $category->level,
];
}
});
return view('settings.categories.edit', compact('category', 'types', 'type_disabled', 'categories'));
}
/**
@ -131,8 +163,10 @@ class Categories extends Controller
*
* @return Response
*/
public function update(Category $category, Request $request)
public function update($category_id, Request $request)
{
$category = $this->getCategoryWithoutChildren($category_id);
$response = $this->ajaxDispatch(new UpdateCategory($category, $request));
if ($response['success']) {
@ -142,7 +176,7 @@ class Categories extends Controller
flash($message)->success();
} else {
$response['redirect'] = route('categories.edit', $category->id);
$response['redirect'] = route('categories.edit', $category_id);
$message = $response['message'];
@ -159,8 +193,10 @@ class Categories extends Controller
*
* @return Response
*/
public function enable(Category $category)
public function enable($category_id)
{
$category = $this->getCategoryWithoutChildren($category_id);
$response = $this->ajaxDispatch(new UpdateCategory($category, request()->merge(['enabled' => 1])));
if ($response['success']) {
@ -177,8 +213,10 @@ class Categories extends Controller
*
* @return Response
*/
public function disable(Category $category)
public function disable($category_id)
{
$category = $this->getCategoryWithoutChildren($category_id);
$response = $this->ajaxDispatch(new UpdateCategory($category, request()->merge(['enabled' => 0])));
if ($response['success']) {

View File

@ -2,9 +2,9 @@
namespace App\Http\Controllers\Settings;
use App\Abstracts\Http\Controller;
use App\Abstracts\Http\SettingController;
class Company extends Controller
class Company extends SettingController
{
public function edit()
{

View File

@ -2,26 +2,19 @@
namespace App\Http\Controllers\Settings;
use App\Abstracts\Http\Controller;
use App\Models\Banking\Account;
use App\Abstracts\Http\SettingController;
use App\Models\Setting\Category;
use App\Models\Setting\Currency;
use App\Models\Setting\Tax;
use App\Utilities\Modules;
class Defaults extends Controller
class Defaults extends SettingController
{
public function edit()
{
$accounts = Account::enabled()->orderBy('name')->pluck('name', 'id');
$currencies = Currency::enabled()->orderBy('name')->pluck('name', 'code');
$sales_categories = Category::income()->enabled()->orderBy('name')->take(setting('default.select_limit'))->pluck('name', 'id');
$sales_categories = Category::income()->enabled()->orderBy('name')->take(setting('default.select_limit'))->get();
$sale_category_id = setting('default.income_category');
if ($sale_category_id && !$sales_categories->has($sale_category_id)) {
if ($sale_category_id && !$sales_categories->pluck('id')->flip()->has($sale_category_id)) {
$category = Category::find($sale_category_id);
if ($category) {
@ -29,11 +22,11 @@ class Defaults extends Controller
}
}
$purchases_categories = Category::expense()->enabled()->orderBy('name')->take(setting('default.select_limit'))->pluck('name', 'id');
$purchases_categories = Category::expense()->enabled()->orderBy('name')->take(setting('default.select_limit'))->get();
$expense_category_id = setting('default.expense_category');
if ($expense_category_id && !$purchases_categories->has($expense_category_id)) {
if ($expense_category_id && !$purchases_categories->pluck('id')->flip()->has($expense_category_id)) {
$category = Category::find($expense_category_id);
if ($category) {
@ -43,15 +36,10 @@ class Defaults extends Controller
$taxes = Tax::enabled()->orderBy('name')->get()->pluck('title', 'id');
$payment_methods = Modules::getPaymentMethods();
return view('settings.default.edit', compact(
'accounts',
'currencies',
'sales_categories',
'purchases_categories',
'taxes',
'payment_methods'
));
}
}

View File

@ -2,50 +2,15 @@
namespace App\Http\Controllers\Settings;
use App\Abstracts\Http\Controller;
use App\Abstracts\Http\SettingController;
use App\Http\Requests\Setting\Setting as Request;
use App\Jobs\Setting\UpdateEmailTemplate;
use App\Models\Common\Company;
use App\Models\Common\EmailTemplate;
use App\Traits\Modules;
use App\Utilities\Installer;
use Illuminate\Support\Str;
class Email extends Controller
class Email extends SettingController
{
use Modules;
public $skip_keys = ['company_id', '_method', '_token', '_prefix'];
/**
* Instantiate a new controller instance.
*/
public function __construct()
{
// No need to check for permission in console
if (app()->runningInConsole()) {
return;
}
// Add CRUD permission check
$this->middleware('permission:create-settings-settings')->only('create', 'store', 'duplicate', 'import');
$this->middleware('permission:read-settings-email')->only('index', 'show', 'edit', 'export');
$this->middleware('permission:update-settings-settings')->only('update', 'enable', 'disable');
$this->middleware('permission:delete-settings-settings')->only('destroy');
}
public function edit()
{
$templates = EmailTemplate::all()->reject(function($template) {
if (Str::startsWith($template->class, 'App')) {
return false;
}
$class = explode('\\', $template->class);
return $this->moduleIsDisabled(Str::kebab($class[1]));
})->all();
$email_protocols = [
'mail' => trans('settings.email.php'),
'smtp' => trans('settings.email.smtp.name'),
@ -53,105 +18,6 @@ class Email extends Controller
'log' => trans('settings.email.log'),
];
return view('settings.email.edit', compact(
'templates',
'email_protocols'
));
}
public function update(Request $request)
{
$fields = $request->all();
$prefix = $request->get('_prefix', 'email');
$total_companies = Company::count();
foreach ($fields as $key => $value) {
$real_key = $prefix . '.' . $key;
// Don't process unwanted keys
if (in_array($key, $this->skip_keys)) {
continue;
}
if (Str::startsWith($key, 'template_')) {
$this->updateEmailTemplate($key, $fields);
continue;
}
if ($total_companies == 1) {
$this->oneCompany($real_key, $value);
}
setting()->set($real_key, $value);
}
// Save all settings
setting()->save();
$message = trans('messages.success.updated', ['type' => trans_choice('general.settings', 2)]);
$response = [
'status' => null,
'success' => true,
'error' => false,
'message' => $message,
'data' => null,
'redirect' => route('settings.index'),
];
flash($message)->success();
return response()->json($response);
}
public function updateEmailTemplate($key, &$fields)
{
$alias = str_replace(['template_', '_subject', '_body'], '', $key);
$subject_key = 'template_' . $alias . '_subject';
$body_key = 'template_' . $alias . '_body';
if (empty($fields[$subject_key]) || empty($fields[$body_key])) {
return;
}
$template = EmailTemplate::alias($alias)->first();
$this->dispatch(new UpdateEmailTemplate($template, [
'subject' => $fields[$subject_key],
'body' => $fields[$body_key],
]));
unset($fields[$subject_key]);
unset($fields[$body_key]);
}
protected function oneCompany($real_key, $value)
{
if (empty($value)) {
return;
}
switch ($real_key) {
case 'email.protocol':
Installer::updateEnv(['MAIL_MAILER' => '"' . $value . '"']);
break;
case 'email.smtp_host':
Installer::updateEnv(['MAIL_HOST' => '"' . $value . '"']);
break;
case 'email.smtp_port':
Installer::updateEnv(['MAIL_PORT' => '"' . $value . '"']);
break;
case 'email.smtp_username':
Installer::updateEnv(['MAIL_USERNAME' => '"' . $value . '"']);
break;
case 'email.smtp_password':
Installer::updateEnv(['MAIL_PASSWORD' => '"' . $value . '"']);
break;
case 'email.smtp_encryption':
Installer::updateEnv(['MAIL_ENCRYPTION' => '"' . $value . '"']);
break;
}
return view('settings.email.edit', compact('email_protocols'));
}
}

View File

@ -0,0 +1,84 @@
<?php
namespace App\Http\Controllers\Settings;
use App\Abstracts\Http\Controller;
use App\Http\Requests\Setting\EmailTemplate as Request;
use App\Jobs\Setting\UpdateEmailTemplate;
use App\Models\Setting\EmailTemplate;
use App\Traits\Modules;
use Illuminate\Support\Str;
class EmailTemplates extends Controller
{
use Modules;
/**
* Display a listing of the resource.
*
* @return Response
*/
public function edit()
{
$templates = [];
EmailTemplate::all()->reject(function($template) {
if (Str::startsWith($template->class, 'App')) {
return false;
}
$class = explode('\\', $template->class);
return $this->moduleIsDisabled(Str::kebab($class[1]));
})->each(function ($template) use (&$templates) {
$templates[$template->group][$template->id] = $template;
});
ksort($templates);
return view('settings.email-templates.edit', compact('templates'));
}
/**
* Update the specified resource in storage.
*
* @param Request $request
*
* @return Response
*/
public function update(Request $request)
{
$template = EmailTemplate::find($request->id);
$response = $this->ajaxDispatch(new UpdateEmailTemplate($template, $request));
if ($response['success']) {
$response['redirect'] = url()->previous();;
$message = trans('messages.success.updated', ['type' => trans($template->name)]);
flash($message)->success();
} else {
$response['redirect'] = url()->previous();;
$message = $response['message'];
flash($message)->error()->important();
}
return response()->json($response);
}
public function get()
{
$template = EmailTemplate::find(request()->id);
$template->tags = trans('settings.email.templates.tags', ['tag_list'=> implode(', ', app($template->class)->getTags())]);
return response()->json([
'errors' => false,
'success' => true,
'data' => $template,
]);
}
}

View File

@ -2,13 +2,14 @@
namespace App\Http\Controllers\Settings;
use App\Abstracts\Http\Controller;
use App\Abstracts\Http\SettingController;
class Invoice extends Controller
class Invoice extends SettingController
{
public function edit()
{
$item_names = [
'hide' => trans('settings.invoice.hide.item_name'),
'settings.invoice.item' => trans('settings.invoice.item'),
'settings.invoice.product' => trans('settings.invoice.product'),
'settings.invoice.service' => trans('settings.invoice.service'),
@ -16,12 +17,14 @@ class Invoice extends Controller
];
$price_names = [
'hide' => trans('settings.invoice.hide.price'),
'settings.invoice.price' => trans('settings.invoice.price'),
'settings.invoice.rate' => trans('settings.invoice.rate'),
'custom' => trans('settings.invoice.custom'),
];
$quantity_names = [
'hide' => trans('settings.invoice.hide.quantity'),
'settings.invoice.quantity' => trans('settings.invoice.quantity'),
'custom' => trans('settings.invoice.custom'),
];

View File

@ -2,10 +2,10 @@
namespace App\Http\Controllers\Settings;
use App\Abstracts\Http\Controller;
use App\Abstracts\Http\SettingController;
use App\Traits\DateTime;
class Localisation extends Controller
class Localisation extends SettingController
{
use DateTime;

View File

@ -72,7 +72,7 @@ class Modules extends Controller
'error' => false,
'message' => $message,
'data' => null,
'redirect' => route('settings.index')//('settings/apps/' . $alias),
'redirect' => route('settings.module.edit', $alias)//('settings/apps/' . $alias),
];
flash($message)->success();

View File

@ -2,9 +2,9 @@
namespace App\Http\Controllers\Settings;
use App\Abstracts\Http\Controller;
use App\Abstracts\Http\SettingController;
class Schedule extends Controller
class Schedule extends SettingController
{
public function edit()
{

View File

@ -1,186 +0,0 @@
<?php
namespace App\Http\Controllers\Settings;
use App\Abstracts\Http\Controller;
use App\Http\Requests\Setting\Setting as Request;
use App\Models\Common\Company;
use App\Models\Module\Module;
use App\Models\Setting\Currency;
use App\Traits\DateTime;
use App\Traits\Uploads;
use App\Utilities\Installer;
use Illuminate\Support\Str;
class Settings extends Controller
{
use DateTime, Uploads;
public $skip_keys = ['company_id', '_method', '_token', '_prefix'];
public $file_keys = ['company.logo', 'invoice.logo'];
public $uploaded_file_keys = ['company.uploaded_logo', 'invoice.uploaded_logo'];
/**
* Show the form for editing the specified resource.
*
* @return Response
*/
public function index()
{
$modules = new \stdClass();
$modules->settings = [];
// Get enabled modules
$enabled_modules = Module::enabled()->get();
foreach ($enabled_modules as $module) {
$m = module($module->alias);
// Check if the module exists and has settings
if (!$m || empty($m->get('settings'))) {
continue;
}
$modules->settings[$m->getAlias()] = [
'name' => $m->getName(),
'description' => $m->getDescription(),
'url' => route('settings.module.edit', ['alias' => $m->getAlias()]),
'icon' => $m->get('icon', 'fa fa-cog'),
];
}
event(new \App\Events\Module\SettingShowing($modules));
$settings = [];
foreach ($modules->settings as $alias => $setting) {
$permission = !empty($setting['permission']) ? $setting['permission'] : 'read-' . $alias . '-settings';
if (!user()->can($permission)) {
continue;
}
$settings[$alias] = $setting;
}
return $this->response('settings.settings.index', ['modules' => $settings]);
}
/**
* Update the specified resource in storage.
*
* @param Request $request
*
* @return Response
*/
public function update(Request $request)
{
$fields = $request->all();
$prefix = $request->get('_prefix', 'general');
$company_id = $request->get('company_id');
if (empty($company_id)) {
$company_id = company_id();
}
$company = Company::find($company_id);
$total_companies = Company::count();
foreach ($fields as $key => $value) {
$real_key = $prefix . '.' . $key;
// Don't process unwanted keys
if (in_array($key, $this->skip_keys)) {
continue;
}
// change dropzone middleware already uploaded file
if (in_array($real_key, $this->uploaded_file_keys)) {
continue;
}
// Process file uploads
if (in_array($real_key, $this->file_keys)) {
// Upload attachment
if ($request->file($key)) {
$media = $this->getMedia($request->file($key), 'settings');
$company->attachMedia($media, Str::snake($real_key));
$value = $media->id;
}
// Prevent reset
if (empty($value)) {
continue;
}
}
if ($real_key == 'default.locale') {
if (!in_array($value, config('language.allowed'))) {
continue;
}
user()->setAttribute('locale', $value)->save();
}
if ($real_key == 'default.currency') {
$currencies = Currency::enabled()->pluck('code')->toArray();
if (!in_array($value, $currencies)) {
continue;
}
$currency = Currency::code($value)->first();
$currency->rate = '1';
$currency->save();
}
// If only 1 company
if ($total_companies == 1) {
$this->oneCompany($real_key, $value);
}
setting()->set($real_key, $value);
}
// Save all settings
setting()->save();
$message = trans('messages.success.updated', ['type' => trans_choice('general.settings', 2)]);
$response = [
'status' => null,
'success' => true,
'error' => false,
'message' => $message,
'data' => null,
'redirect' => route('settings.index'),
];
flash($message)->success();
return response()->json($response);
}
protected function oneCompany($real_key, $value)
{
switch ($real_key) {
case 'company.name':
Installer::updateEnv(['MAIL_FROM_NAME' => '"' . $value . '"']);
break;
case 'company.email':
Installer::updateEnv(['MAIL_FROM_ADDRESS' => '"' . $value . '"']);
break;
case 'default.locale':
Installer::updateEnv(['APP_LOCALE' => '"' . $value . '"']);
break;
case 'schedule.time':
Installer::updateEnv(['APP_SCHEDULE_TIME' => '"' . $value . '"']);
break;
}
}
}

View File

@ -3,7 +3,10 @@
namespace App\Http\Controllers\Settings;
use App\Abstracts\Http\Controller;
use App\Exports\Settings\Taxes as Export;
use App\Http\Requests\Common\Import as ImportRequest;
use App\Http\Requests\Setting\Tax as Request;
use App\Imports\Settings\Taxes as Import;
use App\Jobs\Setting\CreateTax;
use App\Jobs\Setting\DeleteTax;
use App\Jobs\Setting\UpdateTax;
@ -11,7 +14,6 @@ use App\Models\Setting\Tax;
class Taxes extends Controller
{
/**
* Display a listing of the resource.
*
@ -94,6 +96,30 @@ class Taxes extends Controller
return response()->json($response);
}
/**
* Import the specified resource.
*
* @param ImportRequest $request
*
* @return Response
*/
public function import(ImportRequest $request)
{
$response = $this->importExcel(new Import, $request, trans_choice('general.taxes', 2));
if ($response['success']) {
$response['redirect'] = route('taxes.index');
flash($response['message'])->success();
} else {
$response['redirect'] = route('import.create', ['settings', 'taxes']);
flash($response['message'])->error()->important();
}
return response()->json($response);
}
/**
* Show the form for editing the specified resource.
*
@ -210,4 +236,14 @@ class Taxes extends Controller
return response()->json($response);
}
/**
* Export the specified resource.
*
* @return Response
*/
public function export()
{
return $this->exportExcel(new Export, trans_choice('general.taxes', 2));
}
}

View File

@ -32,7 +32,7 @@ class Finish extends Controller
$data = [
'query' => [
'limit' => 4
'limit' => 6
]
];