2017-01-12 19:40:20 -08:00
< ? php
namespace App\Http\Controllers\Api ;
use App\Helpers\Helper ;
2019-03-13 20:12:03 -07:00
use App\Http\Controllers\Controller ;
use App\Http\Transformers\CompaniesTransformer ;
2017-10-26 21:50:01 -07:00
use App\Http\Transformers\SelectlistTransformer ;
2019-03-13 20:12:03 -07:00
use App\Models\Company ;
use Illuminate\Http\Request ;
2021-06-29 02:26:59 -07:00
use App\Http\Requests\ImageUploadRequest ;
2019-05-30 19:10:04 -07:00
use Illuminate\Support\Facades\Storage ;
2024-07-04 23:07:20 -07:00
use Illuminate\Http\JsonResponse ;
2017-01-12 19:40:20 -08:00
class CompaniesController extends Controller
{
/**
* Display a listing of the resource .
*
* @ author [ A . Gianotto ] [ < snipe @ snipe . net > ]
* @ since [ v4 . 0 ]
*/
2024-07-04 23:07:20 -07:00
public function index ( Request $request ) : JsonResponse | array
2017-01-12 19:40:20 -08:00
{
$this -> authorize ( 'view' , Company :: class );
2017-02-08 08:48:41 -08:00
2017-12-12 07:03:31 -08:00
$allowed_columns = [
'id' ,
'name' ,
2023-07-10 11:44:21 -07:00
'phone' ,
'fax' ,
2023-08-13 08:15:20 -07:00
'email' ,
2017-12-12 07:03:31 -08:00
'created_at' ,
'updated_at' ,
'users_count' ,
'assets_count' ,
'licenses_count' ,
'accessories_count' ,
'consumables_count' ,
'components_count' ,
];
2017-02-08 08:48:41 -08:00
2024-02-05 07:55:53 -08:00
$companies = Company :: withCount ([ 'assets as assets_count' => function ( $query ) {
$query -> AssetsForShow ();
2024-09-19 12:38:34 -07:00
}]) -> withCount ( 'assets as assets_count' , 'licenses as licenses_count' , 'accessories as accessories_count' , 'consumables as consumables_count' , 'components as components_count' , 'users as users_count' );
2017-02-08 08:48:41 -08:00
2019-05-23 17:39:50 -07:00
if ( $request -> filled ( 'search' )) {
2017-02-08 08:48:41 -08:00
$companies -> TextSearch ( $request -> input ( 'search' ));
}
2022-06-28 19:59:45 -07:00
if ( $request -> filled ( 'name' )) {
$companies -> where ( 'name' , '=' , $request -> input ( 'name' ));
}
2023-08-13 08:15:20 -07:00
if ( $request -> filled ( 'email' )) {
$companies -> where ( 'email' , '=' , $request -> input ( 'email' ));
}
2024-09-19 09:56:05 -07:00
if ( $request -> filled ( 'created_by' )) {
$companies -> where ( 'created_by' , '=' , $request -> input ( 'created_by' ));
}
2022-06-28 19:59:45 -07:00
2023-04-12 11:28:46 -07:00
// Make sure the offset and limit are actually integers and do not exceed system limits
2023-10-14 12:39:52 -07:00
$offset = ( $request -> input ( 'offset' ) > $companies -> count ()) ? $companies -> count () : app ( 'api_offset_value' );
2023-04-16 08:46:39 -07:00
$limit = app ( 'api_limit_value' );
2017-02-08 08:48:41 -08:00
$order = $request -> input ( 'order' ) === 'asc' ? 'asc' : 'desc' ;
2024-09-19 09:56:05 -07:00
$sort_override = $request -> input ( 'sort' );
$column_sort = in_array ( $sort_override , $allowed_columns ) ? $sort_override : 'created_at' ;
switch ( $sort_override ) {
case 'created_by' :
$companies = $companies -> OrderByCreatedBy ( $order );
break ;
default :
$companies = $companies -> orderBy ( $column_sort , $order );
break ;
}
2017-02-08 08:48:41 -08:00
$total = $companies -> count ();
2024-09-19 09:56:05 -07:00
2017-02-08 08:48:41 -08:00
$companies = $companies -> skip ( $offset ) -> take ( $limit ) -> get ();
2021-06-10 13:15:52 -07:00
return ( new CompaniesTransformer ) -> transformCompanies ( $companies , $total );
2017-02-08 08:48:41 -08:00
2017-01-12 19:40:20 -08:00
}
/**
* Store a newly created resource in storage .
*
* @ author [ A . Gianotto ] [ < snipe @ snipe . net > ]
* @ since [ v4 . 0 ]
2021-06-29 02:26:59 -07:00
* @ param \App\Http\Requests\ImageUploadRequest $request
2017-01-12 19:40:20 -08:00
*/
2024-07-04 23:07:20 -07:00
public function store ( ImageUploadRequest $request ) : JsonResponse
2017-01-12 19:40:20 -08:00
{
$this -> authorize ( 'create' , Company :: class );
$company = new Company ;
$company -> fill ( $request -> all ());
2021-06-29 02:26:59 -07:00
$company = $request -> handleImages ( $company );
2017-01-12 19:40:20 -08:00
if ( $company -> save ()) {
2017-08-03 19:55:08 -07:00
return response () -> json ( Helper :: formatStandardApiResponse ( 'success' , ( new CompaniesTransformer ) -> transformCompany ( $company ), trans ( 'admin/companies/message.create.success' )));
2017-01-12 19:40:20 -08:00
}
2021-06-10 13:15:52 -07:00
2017-01-12 23:41:45 -08:00
return response ()
-> json ( Helper :: formatStandardApiResponse ( 'error' , null , $company -> getErrors ()));
2017-01-12 19:40:20 -08:00
}
/**
* Display the specified resource .
*
* @ author [ A . Gianotto ] [ < snipe @ snipe . net > ]
* @ since [ v4 . 0 ]
* @ param int $id
*/
2024-07-04 23:07:20 -07:00
public function show ( $id ) : array
2017-01-12 19:40:20 -08:00
{
$this -> authorize ( 'view' , Company :: class );
$company = Company :: findOrFail ( $id );
2021-06-10 13:15:52 -07:00
return ( new CompaniesTransformer ) -> transformCompany ( $company );
2017-07-29 15:46:10 -07:00
2017-01-12 19:40:20 -08:00
}
/**
* Update the specified resource in storage .
*
* @ author [ A . Gianotto ] [ < snipe @ snipe . net > ]
* @ since [ v4 . 0 ]
2021-06-29 02:26:59 -07:00
* @ param \App\Http\Requests\ImageUploadRequest $request
2017-01-12 19:40:20 -08:00
* @ param int $id
*/
2024-07-04 23:07:20 -07:00
public function update ( ImageUploadRequest $request , $id ) : JsonResponse
2017-01-12 19:40:20 -08:00
{
2018-07-12 18:28:02 -07:00
$this -> authorize ( 'update' , Company :: class );
2017-01-12 19:40:20 -08:00
$company = Company :: findOrFail ( $id );
$company -> fill ( $request -> all ());
2021-06-29 02:26:59 -07:00
$company = $request -> handleImages ( $company );
2017-01-12 19:40:20 -08:00
if ( $company -> save ()) {
2017-01-12 23:41:45 -08:00
return response ()
2017-08-03 19:55:08 -07:00
-> json ( Helper :: formatStandardApiResponse ( 'success' , ( new CompaniesTransformer ) -> transformCompany ( $company ), trans ( 'admin/companies/message.update.success' )));
2017-01-12 19:40:20 -08:00
}
2017-01-12 23:41:45 -08:00
return response ()
-> json ( Helper :: formatStandardApiResponse ( 'error' , null , $company -> getErrors ()));
2017-01-12 19:40:20 -08:00
}
/**
* Remove the specified resource from storage .
*
* @ author [ A . Gianotto ] [ < snipe @ snipe . net > ]
* @ since [ v4 . 0 ]
* @ param int $id
*/
2024-07-04 23:07:20 -07:00
public function destroy ( $id ) : JsonResponse
2017-01-12 19:40:20 -08:00
{
2020-05-23 10:36:02 -07:00
$this -> authorize ( 'delete' , Company :: class );
$company = Company :: findOrFail ( $id );
$this -> authorize ( 'delete' , $company );
2017-03-11 08:03:16 -08:00
2021-06-10 13:15:52 -07:00
if ( ! $company -> isDeletable ()) {
2017-01-12 23:41:45 -08:00
return response ()
2021-06-10 13:15:52 -07:00
-> json ( Helper :: formatStandardApiResponse ( 'error' , null , trans ( 'admin/companies/message.assoc_users' )));
2017-03-11 08:03:16 -08:00
}
2020-05-23 10:36:02 -07:00
$company -> delete ();
2021-06-10 13:15:52 -07:00
2020-05-23 10:36:02 -07:00
return response ()
2021-06-10 13:15:52 -07:00
-> json ( Helper :: formatStandardApiResponse ( 'success' , null , trans ( 'admin/companies/message.delete.success' )));
2017-01-12 19:40:20 -08:00
}
2017-10-26 16:37:41 -07:00
/**
2017-10-26 21:50:01 -07:00
* Gets a paginated collection for the select2 menus
2017-10-26 16:37:41 -07:00
*
* @ author [ A . Gianotto ] [ < snipe @ snipe . net > ]
2017-10-26 21:50:01 -07:00
* @ since [ v4 . 0.16 ]
* @ see \App\Http\Transformers\SelectlistTransformer
2017-10-26 16:37:41 -07:00
*/
2024-07-04 23:07:20 -07:00
public function selectlist ( Request $request ) : array
2017-10-26 16:37:41 -07:00
{
2022-02-11 11:46:14 -08:00
$this -> authorize ( 'view.selectlists' );
2017-10-26 16:37:41 -07:00
$companies = Company :: select ([
'companies.id' ,
'companies.name' ,
2023-08-13 08:15:20 -07:00
'companies.email' ,
2017-10-26 16:37:41 -07:00
'companies.image' ,
]);
2019-05-23 17:39:50 -07:00
if ( $request -> filled ( 'search' )) {
2017-10-26 16:37:41 -07:00
$companies = $companies -> where ( 'companies.name' , 'LIKE' , '%' . $request -> get ( 'search' ) . '%' );
}
2017-10-26 21:50:01 -07:00
$companies = $companies -> orderBy ( 'name' , 'ASC' ) -> paginate ( 50 );
2017-10-26 16:37:41 -07:00
2017-10-26 21:50:01 -07:00
// Loop through and set some custom properties for the transformer to use.
// This lets us have more flexibility in special cases like assets, where
// they may not have a ->name value but we want to display something anyway
2017-10-26 16:37:41 -07:00
foreach ( $companies as $company ) {
2018-09-29 21:33:52 -07:00
$company -> use_image = ( $company -> image ) ? Storage :: disk ( 'public' ) -> url ( 'companies/' . $company -> image , $company -> image ) : null ;
2017-10-26 16:37:41 -07:00
}
2017-10-26 21:50:01 -07:00
return ( new SelectlistTransformer ) -> transformSelectlist ( $companies );
2017-10-26 16:37:41 -07:00
}
2017-01-12 19:40:20 -08:00
}