add transfer section

This commit is contained in:
mahdi purHosseini
2023-10-10 14:46:26 +03:30
parent 87770eb552
commit 53fac19916
13 changed files with 317 additions and 57 deletions
+29 -5
View File
@@ -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 );
}
@@ -0,0 +1,64 @@
<?php
namespace App\Http\Controllers;
use App\Http\Requests\StoreTransferChangeStatusRequest;
use App\Http\Requests\StoreTransferRequest;
use App\Item;
use App\Transfer;
use Carbon\Carbon;
class TransferController extends Controller
{
public function changeStatus( StoreTransferChangeStatusRequest $request , Transfer $Transfer )
{
if ( auth( 'api' )->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 );
}
}
@@ -0,0 +1,22 @@
<?php
namespace App\Http\Requests;
use App\Item;
use Illuminate\Foundation\Http\FormRequest;
class StoreTransferChangeStatusRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'status' => 'required|in:approved,rejected'
];
}
}
@@ -0,0 +1,22 @@
<?php
namespace App\Http\Requests;
use App\Item;
use Illuminate\Foundation\Http\FormRequest;
class StoreTransferRequest extends FormRequest
{
public function authorize()
{
return true;
}
public function rules()
{
return [
'user_id' => 'required|exists:users,id'
];
}
}
+10
View File
@@ -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" );
}
}
-1
View File
@@ -4,7 +4,6 @@ namespace App\Policies;
use App\User;
use App\Item;
use Doctrine\Tests\Common\Inflector\InflectorTest;
class ItemPolicy
{
+28
View File
@@ -0,0 +1,28 @@
<?php
namespace App\Policies;
use App\Transfer;
use App\User;
use App\Item;
class TransferPolicy
{
public function changeStatus( User $User , Transfer $transfer )
{
if ( $User->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;
}
}
+2
View File
@@ -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',
];
/**
+23
View File
@@ -0,0 +1,23 @@
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
class Transfer extends Model
{
use SoftDeletes;
public $fillable = [ 'user_id' , 'item_id' , 'to_date' , 'from_date' , 'status' ];
public function user()
{
return $this->belongsTo( 'App\User' );
}
public function item()
{
return $this->belongsTo( 'App\Item' );
}
}
+44 -39
View File
@@ -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' );
}
}
@@ -0,0 +1,39 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class CreateTransfersTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('transfers', function (Blueprint $table) {
$table->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');
}
}
+28 -12
View File
@@ -1,12 +1,28 @@
<?php␍
␍
return [␍
␍
'failed' => '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',␍
];␍
<?php
return [
'failed' => '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',
];
+6
View File
@@ -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');