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 ;
2017-10-28 08:37:47 -07:00
use App\Http\Transformers\SelectlistTransformer ;
2019-03-13 20:12:03 -07:00
use App\Http\Transformers\SuppliersTransformer ;
use App\Models\Supplier ;
use Illuminate\Http\Request ;
2021-07-15 13:24:40 -07:00
use App\Http\Requests\ImageUploadRequest ;
2018-09-29 21:33:52 -07:00
use Illuminate\Support\Facades\Storage ;
2017-01-12 19:40:20 -08:00
class SuppliersController extends Controller
{
/**
* Display a listing of the resource .
*
* @ author [ A . Gianotto ] [ < snipe @ snipe . net > ]
* @ since [ v4 . 0 ]
* @ return \Illuminate\Http\Response
*/
2017-01-13 04:50:20 -08:00
public function index ( Request $request )
2017-01-12 19:40:20 -08:00
{
$this -> authorize ( 'view' , Supplier :: class );
2023-04-13 11:12:16 -07:00
$allowed_columns = [ '
id ' ,
'name' ,
'address' ,
'phone' ,
'contact' ,
'fax' ,
'email' ,
'image' ,
'assets_count' ,
'licenses_count' ,
'accessories_count' ,
'components_count' ,
'consumables_count' ,
'url' ,
];
2017-01-13 07:40:08 -08:00
2017-01-13 04:50:20 -08:00
$suppliers = Supplier :: select (
2023-04-13 11:12:16 -07:00
[ 'id' , 'name' , 'address' , 'address2' , 'city' , 'state' , 'country' , 'fax' , 'phone' , 'email' , 'contact' , 'created_at' , 'updated_at' , 'deleted_at' , 'image' , 'notes' ])
-> withCount ( 'assets as assets_count' )
-> withCount ( 'licenses as licenses_count' )
-> withCount ( 'accessories as accessories_count' )
-> withCount ( 'components as components_count' )
-> withCount ( 'consumables as consumables_count' );
2017-01-13 04:50:20 -08:00
2019-05-23 17:39:50 -07:00
if ( $request -> filled ( 'search' )) {
2017-01-13 04:50:20 -08:00
$suppliers = $suppliers -> TextSearch ( $request -> input ( 'search' ));
}
2022-06-28 19:59:45 -07:00
if ( $request -> filled ( 'name' )) {
$suppliers -> where ( 'name' , '=' , $request -> input ( 'name' ));
}
if ( $request -> filled ( 'address' )) {
$suppliers -> where ( 'address' , '=' , $request -> input ( 'address' ));
}
if ( $request -> filled ( 'address2' )) {
$suppliers -> where ( 'address2' , '=' , $request -> input ( 'address2' ));
}
if ( $request -> filled ( 'city' )) {
$suppliers -> where ( 'city' , '=' , $request -> input ( 'city' ));
}
if ( $request -> filled ( 'zip' )) {
$suppliers -> where ( 'zip' , '=' , $request -> input ( 'zip' ));
}
if ( $request -> filled ( 'country' )) {
$suppliers -> where ( 'country' , '=' , $request -> input ( 'country' ));
}
if ( $request -> filled ( 'fax' )) {
$suppliers -> where ( 'fax' , '=' , $request -> input ( 'fax' ));
}
if ( $request -> filled ( 'email' )) {
$suppliers -> where ( 'email' , '=' , $request -> input ( 'email' ));
}
if ( $request -> filled ( 'url' )) {
$suppliers -> where ( 'url' , '=' , $request -> input ( 'url' ));
}
if ( $request -> filled ( 'notes' )) {
$suppliers -> where ( 'notes' , '=' , $request -> input ( 'notes' ));
}
2023-04-12 11:28:46 -07:00
// Make sure the offset and limit are actually integers and do not exceed system limits
2023-04-15 17:28:25 -07:00
$offset = ( $request -> input ( 'offset' ) > $suppliers -> count ()) ? $suppliers -> count () : abs ( $request -> input ( 'offset' ));
2023-04-16 08:46:39 -07:00
$limit = app ( 'api_limit_value' );
2019-09-03 14:02:08 -07:00
2017-01-13 04:50:20 -08:00
$order = $request -> input ( 'order' ) === 'asc' ? 'asc' : 'desc' ;
$sort = in_array ( $request -> input ( 'sort' ), $allowed_columns ) ? $request -> input ( 'sort' ) : 'created_at' ;
$suppliers -> orderBy ( $sort , $order );
$total = $suppliers -> count ();
$suppliers = $suppliers -> skip ( $offset ) -> take ( $limit ) -> get ();
2021-06-10 13:15:52 -07:00
2017-05-31 06:52:37 -07:00
return ( new SuppliersTransformer ) -> transformSuppliers ( $suppliers , $total );
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:29:07 -07:00
* @ param \App\Http\Requests\ImageUploadRequest $request
2017-01-12 19:40:20 -08:00
* @ return \Illuminate\Http\Response
*/
2021-06-29 02:29:07 -07:00
public function store ( ImageUploadRequest $request )
2017-01-12 19:40:20 -08:00
{
$this -> authorize ( 'create' , Supplier :: class );
$supplier = new Supplier ;
$supplier -> fill ( $request -> all ());
2021-06-29 02:29:07 -07:00
$supplier = $request -> handleImages ( $supplier );
2017-01-12 19:40:20 -08:00
if ( $supplier -> save ()) {
return response () -> json ( Helper :: formatStandardApiResponse ( 'success' , $supplier , trans ( 'admin/suppliers/message.create.success' )));
}
2021-06-10 13:15:52 -07:00
return response () -> json ( Helper :: formatStandardApiResponse ( 'error' , null , $supplier -> 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
* @ return \Illuminate\Http\Response
*/
public function show ( $id )
{
$this -> authorize ( 'view' , Supplier :: class );
$supplier = Supplier :: findOrFail ( $id );
2021-06-10 13:15:52 -07:00
2017-07-29 15:46:10 -07:00
return ( new SuppliersTransformer ) -> transformSupplier ( $supplier );
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:29:07 -07:00
* @ param \App\Http\Requests\ImageUploadRequest $request
2017-01-12 19:40:20 -08:00
* @ param int $id
* @ return \Illuminate\Http\Response
*/
2021-06-29 02:29:07 -07:00
public function update ( ImageUploadRequest $request , $id )
2017-01-12 19:40:20 -08:00
{
2018-07-12 18:28:02 -07:00
$this -> authorize ( 'update' , Supplier :: class );
2017-01-12 19:40:20 -08:00
$supplier = Supplier :: findOrFail ( $id );
$supplier -> fill ( $request -> all ());
2021-06-29 02:29:07 -07:00
$supplier = $request -> handleImages ( $supplier );
2017-01-12 19:40:20 -08:00
if ( $supplier -> save ()) {
return response () -> json ( Helper :: formatStandardApiResponse ( 'success' , $supplier , trans ( 'admin/suppliers/message.update.success' )));
}
return response () -> json ( Helper :: formatStandardApiResponse ( 'error' , null , $supplier -> getErrors ()));
}
/**
* Remove the specified resource from storage .
*
* @ author [ A . Gianotto ] [ < snipe @ snipe . net > ]
* @ since [ v4 . 0 ]
* @ param int $id
* @ return \Illuminate\Http\Response
*/
public function destroy ( $id )
{
$this -> authorize ( 'delete' , Supplier :: class );
2021-06-10 13:15:52 -07:00
$supplier = Supplier :: with ( 'asset_maintenances' , 'assets' , 'licenses' ) -> withCount ( 'asset_maintenances as asset_maintenances_count' , 'assets as assets_count' , 'licenses as licenses_count' ) -> findOrFail ( $id );
2017-01-12 19:40:20 -08:00
$this -> authorize ( 'delete' , $supplier );
2017-10-18 05:47:20 -07:00
if ( $supplier -> assets_count > 0 ) {
2021-06-10 13:15:52 -07:00
return response () -> json ( Helper :: formatStandardApiResponse ( 'error' , null , trans ( 'admin/suppliers/message.delete.assoc_assets' , [ 'asset_count' => ( int ) $supplier -> assets_count ])));
2017-10-18 05:47:20 -07:00
}
if ( $supplier -> asset_maintenances_count > 0 ) {
2021-06-10 13:15:52 -07:00
return response () -> json ( Helper :: formatStandardApiResponse ( 'error' , null , trans ( 'admin/suppliers/message.delete.assoc_maintenances' , [ 'asset_maintenances_count' => $supplier -> asset_maintenances_count ])));
2017-10-18 05:47:20 -07:00
}
if ( $supplier -> licenses_count > 0 ) {
return response () -> json ( Helper :: formatStandardApiResponse ( 'error' , null , trans ( 'admin/suppliers/message.delete.assoc_licenses' , [ 'licenses_count' => ( int ) $supplier -> licenses_count ])));
}
2017-01-12 19:40:20 -08:00
$supplier -> delete ();
2021-06-10 13:15:52 -07:00
return response () -> json ( Helper :: formatStandardApiResponse ( 'success' , null , trans ( 'admin/suppliers/message.delete.success' )));
2017-01-12 19:40:20 -08:00
}
2017-10-28 08:37:47 -07:00
/**
* Gets a paginated collection for the select2 menus
*
* @ author [ A . Gianotto ] [ < snipe @ snipe . net > ]
* @ since [ v4 . 0.16 ]
* @ see \App\Http\Transformers\SelectlistTransformer
*/
public function selectlist ( Request $request )
{
2022-02-11 11:46:14 -08:00
$this -> authorize ( 'view.selectlists' );
2017-10-28 08:37:47 -07:00
$suppliers = Supplier :: select ([
'id' ,
'name' ,
'image' ,
]);
2019-05-23 17:39:50 -07:00
if ( $request -> filled ( 'search' )) {
2017-11-01 21:55:17 -07:00
$suppliers = $suppliers -> where ( 'suppliers.name' , 'LIKE' , '%' . $request -> get ( 'search' ) . '%' );
2017-10-28 08:37:47 -07:00
}
$suppliers = $suppliers -> orderBy ( 'name' , 'ASC' ) -> paginate ( 50 );
// 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
foreach ( $suppliers as $supplier ) {
$supplier -> use_text = $supplier -> name ;
2018-09-29 21:33:52 -07:00
$supplier -> use_image = ( $supplier -> image ) ? Storage :: disk ( 'public' ) -> url ( 'suppliers/' . $supplier -> image , $supplier -> image ) : null ;
2017-10-28 08:37:47 -07:00
}
return ( new SelectlistTransformer ) -> transformSelectlist ( $suppliers );
}
2017-01-12 19:40:20 -08:00
}