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 ) { 'user.medical_center' => function ( $query ) {
$query->select( 'id' , 'name' ); $query->select( 'id' , 'name' );
} ] ) },
"transfers" => function ( $query ) {
$query->with( [ 'user' => function ( $query ) {
$query->select( 'id' , 'name' , 'medical_center_id' );
} ] );
}
] )
->paginate( 10 ); ->paginate( 10 );
return \MessageResponse::data( $Items ); return \MessageResponse::data( $Items );
} }
@@ -67,7 +73,13 @@ class ItemController extends Controller
} , } ,
'user.medical_center' => function ( $query ) { 'user.medical_center' => function ( $query ) {
$query->select( 'id' , 'name' ); $query->select( 'id' , 'name' );
} ] ); },
"transfers" => function ( $query ) {
$query->with( [ 'user' => function ( $query ) {
$query->select( 'id' , 'name' , 'medical_center_id' );
} ] );
}
] );
$FilesPath = []; $FilesPath = [];
if ( count( $Item->files ) ) { if ( count( $Item->files ) ) {
@@ -134,7 +146,7 @@ class ItemController extends Controller
public function destroy( Item $Item ) 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' ) ); return \MessageResponse::error( trans( 'messages.access_denied' ) );
} }
if ( count( $Item->packages ) ) { if ( count( $Item->packages ) ) {
@@ -165,7 +177,13 @@ class ItemController extends Controller
} , } ,
'user.medical_center' => function ( $query ) { 'user.medical_center' => function ( $query ) {
$query->select( 'id' , 'name' ); $query->select( 'id' , 'name' );
} ] ) },
"transfers" => function ( $query ) {
$query->with( [ 'user' => function ( $query ) {
$query->select( 'id' , 'name' , 'medical_center_id' );
} ] );
}
] )
->get(); ->get();
return \MessageResponse::data( $Items ); return \MessageResponse::data( $Items );
@@ -178,7 +196,13 @@ class ItemController extends Controller
} , } ,
'user.medical_center' => function ( $query ) { 'user.medical_center' => function ( $query ) {
$query->select( 'id' , 'name' ); $query->select( 'id' , 'name' );
} ] ); },
"transfers" => function ( $query ) {
$query->with( [ 'user' => function ( $query ) {
$query->select( 'id' , 'name' , 'medical_center_id' );
} ] );
}
] );
return \MessageResponse::data( $Item ); 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' ); 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\User;
use App\Item; use App\Item;
use Doctrine\Tests\Common\Inflector\InflectorTest;
class ItemPolicy 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\MedicalCenter' => 'App\Policies\MedicalCenterPolicy',
'App\User' => 'App\Policies\UserPolicy', 'App\User' => 'App\Policies\UserPolicy',
'App\TestType' => 'App\Policies\TestTypePolicy', '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; namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Passport\HasApiTokens; use Laravel\Passport\HasApiTokens;
use Spatie\Permission\Traits\HasRoles; use Spatie\Permission\Traits\HasRoles;
class User extends Authenticatable class User extends Authenticatable
{ {
use Notifiable, HasApiTokens, HasRoles; use Notifiable , HasApiTokens , HasRoles;
/** /**
* The attributes that are mass assignable. * The attributes that are mass assignable.
* *
* @var array * @var array
*/ */
protected $fillable = [ protected $fillable = [
'name', 'email', 'password','status','medical_center_id','address', 'gender' 'name' , 'email' , 'password' , 'status' , 'medical_center_id' , 'address' , 'gender'
]; ];
/** /**
* The attributes that should be hidden for arrays. * The attributes that should be hidden for arrays.
* *
* @var array * @var array
*/ */
protected $hidden = [ protected $hidden = [
'password', 'remember_token', 'password' , 'remember_token' ,
]; ];
/** /**
@@ -35,50 +34,56 @@ class User extends Authenticatable
* @var array * @var array
*/ */
protected $casts = [ protected $casts = [
'email_verified_at' => 'datetime', 'email_verified_at' => 'datetime' ,
]; ];
public function medical_center() public function medical_center()
{ {
return $this->belongsTo('App\MedicalCenter'); return $this->belongsTo( 'App\MedicalCenter' );
} }
public function test_results() public function test_results()
{ {
return $this->hasMany('App\TestResult'); return $this->hasMany( 'App\TestResult' );
} }
public function test_types() public function test_types()
{ {
return $this->hasMany('App\TestType'); return $this->hasMany( 'App\TestType' );
} }
public function findForPassport($username) public function findForPassport( $username )
{ {
return $this->where('cell_number', $username)->where('status', 'Active')->first(); return $this->where( 'cell_number' , $username )->where( 'status' , 'Active' )->first();
} }
public function messagesSent() public function messagesSent()
{ {
return $this->hasMany('App\Message', 'sender_user_id'); return $this->hasMany( 'App\Message' , 'sender_user_id' );
} }
public function messagesReceived() public function messagesReceived()
{ {
return $this->hasMany('App\Message', 'recipient_user_id'); return $this->hasMany( 'App\Message' , 'recipient_user_id' );
} }
public function packages()
{ public function packages()
return $this->hasMany('App\Package'); {
} return $this->hasMany( 'App\Package' );
public function items() }
{
return $this->hasMany('App\Item'); public function items()
} {
public function labels() return $this->hasMany( 'App\Item' );
{ }
return $this->hasMany('App\Label');
} public function labels()
public function cycles() {
{ return $this->hasMany( 'App\Label' );
return $this->hasMany('App\Cycle'); }
}
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␍ <?php
␍
return [␍
␍
'failed' => 'Error',␍ return [
'failed_message' => "You've encountered an error",␍
'success' => 'Success',␍
'success_message' => 'Done Successfully',␍
'create' => 'The Item created successfully',␍ 'failed' => 'Error',
'update' => 'The Item updated successfully',␍
'access_denied' => 'You dont have permission to do it',␍ '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::resource('Items', 'ItemController');
Route::post('Items/ChangeStatus/{Item}', 'ItemController@changeStatus'); 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('Packages', 'PackageController')->except(['showPackage']);
Route::resource('Labels', 'LabelController'); Route::resource('Labels', 'LabelController');