From 53fac19916c6f339825b7ae96f54bfbb4f047612 Mon Sep 17 00:00:00 2001 From: mahdi purHosseini Date: Tue, 10 Oct 2023 14:46:26 +0330 Subject: [PATCH] add transfer section --- app/Http/Controllers/ItemController.php | 34 ++++++-- app/Http/Controllers/TransferController.php | 64 ++++++++++++++ .../StoreTransferChangeStatusRequest.php | 22 +++++ app/Http/Requests/StoreTransferRequest.php | 22 +++++ app/Item.php | 10 +++ app/Policies/ItemPolicy.php | 1 - app/Policies/TransferPolicy.php | 28 +++++++ app/Providers/AuthServiceProvider.php | 2 + app/Transfer.php | 23 +++++ app/User.php | 83 ++++++++++--------- ...23_10_10_110117_create_transfers_table.php | 39 +++++++++ resources/lang/en/messages.php | 40 ++++++--- routes/api.php | 6 ++ 13 files changed, 317 insertions(+), 57 deletions(-) create mode 100644 app/Http/Controllers/TransferController.php create mode 100644 app/Http/Requests/StoreTransferChangeStatusRequest.php create mode 100644 app/Http/Requests/StoreTransferRequest.php create mode 100644 app/Policies/TransferPolicy.php create mode 100644 app/Transfer.php create mode 100644 database/migrations/2023_10_10_110117_create_transfers_table.php diff --git a/app/Http/Controllers/ItemController.php b/app/Http/Controllers/ItemController.php index f46ec447..344a9531 100644 --- a/app/Http/Controllers/ItemController.php +++ b/app/Http/Controllers/ItemController.php @@ -50,7 +50,13 @@ class ItemController extends Controller } , 'user.medical_center' => function ( $query ) { $query->select( 'id' , 'name' ); - } ] ) + }, + "transfers" => function ( $query ) { + $query->with( [ 'user' => function ( $query ) { + $query->select( 'id' , 'name' , 'medical_center_id' ); + } ] ); + } + ] ) ->paginate( 10 ); return \MessageResponse::data( $Items ); } @@ -67,7 +73,13 @@ class ItemController extends Controller } , 'user.medical_center' => function ( $query ) { $query->select( 'id' , 'name' ); - } ] ); + }, + "transfers" => function ( $query ) { + $query->with( [ 'user' => function ( $query ) { + $query->select( 'id' , 'name' , 'medical_center_id' ); + } ] ); + } + ] ); $FilesPath = []; if ( count( $Item->files ) ) { @@ -134,7 +146,7 @@ class ItemController extends Controller public function destroy( Item $Item ) { - if ( ! auth( 'api' )->user()->can( 'delete' , $Item ) ) { + if ( ! auth( 'api' )->user()->can( 'delete' , Item::class ) ) { return \MessageResponse::error( trans( 'messages.access_denied' ) ); } if ( count( $Item->packages ) ) { @@ -165,7 +177,13 @@ class ItemController extends Controller } , 'user.medical_center' => function ( $query ) { $query->select( 'id' , 'name' ); - } ] ) + }, + "transfers" => function ( $query ) { + $query->with( [ 'user' => function ( $query ) { + $query->select( 'id' , 'name' , 'medical_center_id' ); + } ] ); + } + ] ) ->get(); return \MessageResponse::data( $Items ); @@ -178,7 +196,13 @@ class ItemController extends Controller } , 'user.medical_center' => function ( $query ) { $query->select( 'id' , 'name' ); - } ] ); + }, + "transfers" => function ( $query ) { + $query->with( [ 'user' => function ( $query ) { + $query->select( 'id' , 'name' , 'medical_center_id' ); + } ] ); + } + ] ); return \MessageResponse::data( $Item ); } diff --git a/app/Http/Controllers/TransferController.php b/app/Http/Controllers/TransferController.php new file mode 100644 index 00000000..8835d67d --- /dev/null +++ b/app/Http/Controllers/TransferController.php @@ -0,0 +1,64 @@ +user()->cant( 'changeStatus' , [ Transfer::class , $Transfer ] ) ) { + return \MessageResponse::error( trans( 'messages.access_denied' ) ); + } + if ( $Transfer->status == "suspended" ) { + if ( $request->status == "approved" ) { + $item = $Transfer->item; + $item->transferActive->update( [ "to_date" => Carbon::now() ] ); + $Transfer->update( [ "status" => $request->status ] ); + $item->update( [ "user_id" => $Transfer->user_id ] ); + } else { + $Transfer->update( [ "status" => $request->status ] ); + } + } else { + return \MessageResponse::error( trans( 'messages.change_status_denied_transfer' ) ); + } + return \MessageResponse::success( trans( 'messages.success' ) ); + } + + public function transfer( StoreTransferRequest $request , Item $Item ) + { + if ( auth( 'api' )->user()->cant( 'transfer' , [ Transfer::class , $Item ] ) ) { + return \MessageResponse::error( trans( 'messages.access_denied' ) ); + } + if ( $Item->user_id != $request->user_id ) { + $Item->transfers()->create( [ + "user_id" => $request->user_id , + "from_date" => Carbon::now() , + "status" => "suspended" + ] ); + } else { + return \MessageResponse::error( trans( 'messages.user_denied_transfer' ) ); + } + return \MessageResponse::success( trans( 'messages.success' ) ); + } + + public function mySuspendedTransfer() + { + $data = Transfer::where( "user_id" , auth()->id() )->where( "status" , "suspended" )->with( [ "item" ] )->get(); + return \MessageResponse::data( $data ); + } + + public function suspendedTransfer() + { + if ( auth( 'api' )->user()->cant( 'suspendedTransfer' , Transfer::class ) ) { + return \MessageResponse::error( trans( 'messages.access_denied' ) ); + } + $data = Transfer::where( "status" , "suspended" )->with( [ "user" , "item" ] )->get(); + return \MessageResponse::data( $data ); + } +} diff --git a/app/Http/Requests/StoreTransferChangeStatusRequest.php b/app/Http/Requests/StoreTransferChangeStatusRequest.php new file mode 100644 index 00000000..02778d23 --- /dev/null +++ b/app/Http/Requests/StoreTransferChangeStatusRequest.php @@ -0,0 +1,22 @@ + 'required|in:approved,rejected' + ]; + } + +} diff --git a/app/Http/Requests/StoreTransferRequest.php b/app/Http/Requests/StoreTransferRequest.php new file mode 100644 index 00000000..fbcfce84 --- /dev/null +++ b/app/Http/Requests/StoreTransferRequest.php @@ -0,0 +1,22 @@ + 'required|exists:users,id' + ]; + } + +} diff --git a/app/Item.php b/app/Item.php index f56cf7fa..67bc36f0 100644 --- a/app/Item.php +++ b/app/Item.php @@ -22,4 +22,14 @@ { return $this->morphMany( 'App\Media' , 'model' ); } + + public function transfers() + { + return $this->hasMany( 'App\Transfer' )->where( "status" ,"approved" ); + } + + public function transferActive() + { + return $this->hasOne( 'App\Transfer' )->where( "status" ,"approved" )->whereNull( "to_date" ); + } } diff --git a/app/Policies/ItemPolicy.php b/app/Policies/ItemPolicy.php index 2d26342a..69d5ee4a 100644 --- a/app/Policies/ItemPolicy.php +++ b/app/Policies/ItemPolicy.php @@ -4,7 +4,6 @@ namespace App\Policies; use App\User; use App\Item; -use Doctrine\Tests\Common\Inflector\InflectorTest; class ItemPolicy { diff --git a/app/Policies/TransferPolicy.php b/app/Policies/TransferPolicy.php new file mode 100644 index 00000000..ccae5bb2 --- /dev/null +++ b/app/Policies/TransferPolicy.php @@ -0,0 +1,28 @@ +hasRole( 'Admin|Supervisor' ) || $transfer->user_id == $User->id ) + return true; + } + + public function transfer( User $User , Item $Item ) + { + if ( $User->hasRole( 'Admin|Supervisor' ) || $Item->user_id == $User->id ) + return true; + } + + public function suspendedTransfer( User $User ) + { + if ( $User->hasRole( 'Admin|Supervisor' ) ) + return true; + } +} diff --git a/app/Providers/AuthServiceProvider.php b/app/Providers/AuthServiceProvider.php index 465ec329..35b436c3 100644 --- a/app/Providers/AuthServiceProvider.php +++ b/app/Providers/AuthServiceProvider.php @@ -17,6 +17,8 @@ class AuthServiceProvider extends ServiceProvider 'App\MedicalCenter' => 'App\Policies\MedicalCenterPolicy', 'App\User' => 'App\Policies\UserPolicy', 'App\TestType' => 'App\Policies\TestTypePolicy', + 'App\Item' => 'App\Policies\ItemPolicy', + 'App\Transfer' => 'App\Policies\TransferPolicy', ]; /** diff --git a/app/Transfer.php b/app/Transfer.php new file mode 100644 index 00000000..1096d184 --- /dev/null +++ b/app/Transfer.php @@ -0,0 +1,23 @@ +belongsTo( 'App\User' ); + } + + public function item() + { + return $this->belongsTo( 'App\Item' ); + } +} diff --git a/app/User.php b/app/User.php index a3a5208b..7f490aa6 100644 --- a/app/User.php +++ b/app/User.php @@ -2,31 +2,30 @@ namespace App; -use Illuminate\Notifications\Notifiable; -use Illuminate\Contracts\Auth\MustVerifyEmail; use Illuminate\Foundation\Auth\User as Authenticatable; +use Illuminate\Notifications\Notifiable; use Laravel\Passport\HasApiTokens; use Spatie\Permission\Traits\HasRoles; class User extends Authenticatable { - use Notifiable, HasApiTokens, HasRoles; + use Notifiable , HasApiTokens , HasRoles; /** * The attributes that are mass assignable. * * @var array */ - protected $fillable = [ - 'name', 'email', 'password','status','medical_center_id','address', 'gender' - ]; + protected $fillable = [ + 'name' , 'email' , 'password' , 'status' , 'medical_center_id' , 'address' , 'gender' + ]; /** * The attributes that should be hidden for arrays. * * @var array */ protected $hidden = [ - 'password', 'remember_token', + 'password' , 'remember_token' , ]; /** @@ -35,50 +34,56 @@ class User extends Authenticatable * @var array */ protected $casts = [ - 'email_verified_at' => 'datetime', + 'email_verified_at' => 'datetime' , ]; public function medical_center() { - return $this->belongsTo('App\MedicalCenter'); + return $this->belongsTo( 'App\MedicalCenter' ); } + public function test_results() { - return $this->hasMany('App\TestResult'); + return $this->hasMany( 'App\TestResult' ); } + public function test_types() { - return $this->hasMany('App\TestType'); + return $this->hasMany( 'App\TestType' ); } - public function findForPassport($username) - { - return $this->where('cell_number', $username)->where('status', 'Active')->first(); - } + public function findForPassport( $username ) + { + return $this->where( 'cell_number' , $username )->where( 'status' , 'Active' )->first(); + } - public function messagesSent() - { - return $this->hasMany('App\Message', 'sender_user_id'); - } + public function messagesSent() + { + return $this->hasMany( 'App\Message' , 'sender_user_id' ); + } - public function messagesReceived() - { - return $this->hasMany('App\Message', 'recipient_user_id'); - } - public function packages() - { - return $this->hasMany('App\Package'); - } - public function items() - { - return $this->hasMany('App\Item'); - } - public function labels() - { - return $this->hasMany('App\Label'); - } - public function cycles() - { - return $this->hasMany('App\Cycle'); - } + public function messagesReceived() + { + return $this->hasMany( 'App\Message' , 'recipient_user_id' ); + } + + public function packages() + { + return $this->hasMany( 'App\Package' ); + } + + public function items() + { + return $this->hasMany( 'App\Item' ); + } + + public function labels() + { + return $this->hasMany( 'App\Label' ); + } + + public function cycles() + { + return $this->hasMany( 'App\Cycle' ); + } } diff --git a/database/migrations/2023_10_10_110117_create_transfers_table.php b/database/migrations/2023_10_10_110117_create_transfers_table.php new file mode 100644 index 00000000..42a4a9e4 --- /dev/null +++ b/database/migrations/2023_10_10_110117_create_transfers_table.php @@ -0,0 +1,39 @@ +bigIncrements('id'); + $table->unsignedBigInteger('item_id'); + $table->foreign('item_id')->references('id')->on('items'); + $table->unsignedBigInteger('user_id'); + $table->foreign('user_id')->references('id')->on('users'); + $table->dateTime('from_date')->nullable(); + $table->dateTime('to_date')->nullable(); + $table->enum('status', ['approved','rejected','suspended'])->default('suspended'); + $table->timestamps(); + $table->softDeletes(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::dropIfExists('transfers'); + } +} diff --git a/resources/lang/en/messages.php b/resources/lang/en/messages.php index 836f1ce3..5d155092 100644 --- a/resources/lang/en/messages.php +++ b/resources/lang/en/messages.php @@ -1,12 +1,28 @@ - 'Error', - 'failed_message' => "You've encountered an error", - 'success' => 'Success', - 'success_message' => 'Done Successfully', - 'create' => 'The Item created successfully', - 'update' => 'The Item updated successfully', - 'access_denied' => 'You dont have permission to do it', -]; + 'Error', + + 'failed_message' => "You've encountered an error", + + 'success' => 'Success', + + 'success_message' => 'Done Successfully', + + 'create' => 'The Item created successfully', + + 'update' => 'The Item updated successfully', + + 'access_denied' => 'You dont have permission to do it', + + 'change_status_denied_transfer' => 'The Transfer has been approved or rejected before', + + 'user_denied_transfer' => 'The Item has been transferred before to this user', + +]; + diff --git a/routes/api.php b/routes/api.php index 845a4e61..52b4fd6b 100644 --- a/routes/api.php +++ b/routes/api.php @@ -49,6 +49,12 @@ Route::middleware('auth:api')->group(function () { Route::resource('Items', 'ItemController'); Route::post('Items/ChangeStatus/{Item}', 'ItemController@changeStatus'); + + Route::post('transfers/ChangeStatus/{Transfer}', 'TransferController@changeStatus'); + Route::post('transfers/{Item}', 'TransferController@transfer'); + Route::get('my-suspended-transfers', 'TransferController@mySuspendedTransfer'); + Route::get('suspended-transfers', 'TransferController@suspendedTransfer'); + Route::resource('Packages', 'PackageController')->except(['showPackage']); Route::resource('Labels', 'LabelController');