2018-07-24 19:35:26 -07:00
< ? php
namespace App\Http\Controllers\Licenses ;
2018-09-10 07:40:26 -07:00
use App\Events\CheckoutableCheckedOut ;
2019-03-13 20:12:03 -07:00
use App\Http\Controllers\Controller ;
2018-07-24 19:35:26 -07:00
use App\Http\Requests\LicenseCheckoutRequest ;
use App\Models\Asset ;
use App\Models\License ;
use App\Models\LicenseSeat ;
use App\Models\User ;
use Illuminate\Support\Facades\Auth ;
class LicenseCheckoutController extends Controller
{
/**
* Provides the form view for checking out a license to a user .
* Here we pass the license seat ID instead of the license ID ,
* because licenses themselves are never checked out to anyone ,
* only the seats associated with them .
*
* @ author [ A . Gianotto ] [ < snipe @ snipe . net > ]
* @ since [ v1 . 0 ]
2018-07-27 12:01:25 -07:00
* @ param $licenseId
2018-07-24 19:35:26 -07:00
* @ return \Illuminate\Contracts\View\View
* @ throws \Illuminate\Auth\Access\AuthorizationException
*/
2018-07-27 12:01:25 -07:00
public function create ( $licenseId )
2018-07-24 19:35:26 -07:00
{
// Check that the license is valid
if ( $license = License :: find ( $licenseId )) {
// If the license is valid, check that there is an available seat
if ( $license -> avail_seats_count < 1 ) {
return redirect () -> route ( 'licenses.index' ) -> with ( 'error' , 'There are no available seats for this license' );
}
}
$this -> authorize ( 'checkout' , $license );
2021-06-10 13:15:52 -07:00
2018-07-24 19:35:26 -07:00
return view ( 'licenses/checkout' , compact ( 'license' ));
}
/**
* Validates and stores the license checkout action .
*
* @ author [ A . Gianotto ] [ < snipe @ snipe . net > ]
* @ since [ v1 . 0 ]
* @ param LicenseCheckoutRequest $request
* @ param $licenseId
* @ return \Illuminate\Http\RedirectResponse
* @ throws \Illuminate\Auth\Access\AuthorizationException
*/
public function store ( LicenseCheckoutRequest $request , $licenseId , $seatId = null )
{
2021-06-10 13:15:52 -07:00
if ( ! $license = License :: find ( $licenseId )) {
2018-07-24 19:35:26 -07:00
return redirect () -> route ( 'licenses.index' ) -> with ( 'error' , trans ( 'admin/licenses/message.not_found' ));
}
$this -> authorize ( 'checkout' , $license );
2018-07-27 12:03:04 -07:00
$licenseSeat = $this -> findLicenseSeatToCheckout ( $license , $seatId );
2018-07-24 19:35:26 -07:00
$licenseSeat -> user_id = Auth :: id ();
2022-09-20 16:55:53 -07:00
2018-07-24 19:35:26 -07:00
2018-07-27 12:03:04 -07:00
$checkoutMethod = 'checkoutTo' . ucwords ( request ( 'checkout_to_type' ));
2018-07-24 19:35:26 -07:00
if ( $this -> $checkoutMethod ( $licenseSeat )) {
2021-06-10 13:15:52 -07:00
return redirect () -> route ( 'licenses.index' ) -> with ( 'success' , trans ( 'admin/licenses/message.checkout.success' ));
2018-07-24 19:35:26 -07:00
}
2018-07-27 12:03:04 -07:00
2021-06-10 13:15:52 -07:00
return redirect () -> route ( 'licenses.index' ) -> with ( 'error' , trans ( 'Something went wrong handling this checkout.' ));
2018-07-24 19:35:26 -07:00
}
2018-07-27 12:03:04 -07:00
protected function findLicenseSeatToCheckout ( $license , $seatId )
{
$licenseSeat = LicenseSeat :: find ( $seatId ) ? ? $license -> freeSeat ();
2021-06-10 13:15:52 -07:00
if ( ! $licenseSeat ) {
2018-07-27 12:03:04 -07:00
if ( $seatId ) {
2022-09-20 16:55:53 -07:00
throw new \Illuminate\Http\Exceptions\HttpResponseException ( redirect () -> route ( 'licenses.index' ) -> with ( 'error' , 'This Seat is not available for checkout.' ));
2018-07-27 12:03:04 -07:00
}
2022-09-20 16:55:53 -07:00
throw new \Illuminate\Http\Exceptions\HttpResponseException ( redirect () -> route ( 'licenses.index' ) -> with ( 'error' , 'There are no available seats for this license.' ));
2018-07-27 12:03:04 -07:00
}
2021-06-10 13:15:52 -07:00
if ( ! $licenseSeat -> license -> is ( $license )) {
2022-09-20 16:55:53 -07:00
throw new \Illuminate\Http\Exceptions\HttpResponseException ( redirect () -> route ( 'licenses.index' ) -> with ( 'error' , 'The license seat provided does not match the license.' ));
2018-07-27 12:03:04 -07:00
}
return $licenseSeat ;
}
2018-07-24 19:35:26 -07:00
protected function checkoutToAsset ( $licenseSeat )
{
if ( is_null ( $target = Asset :: find ( request ( 'asset_id' )))) {
return redirect () -> route ( 'licenses.index' ) -> with ( 'error' , trans ( 'admin/licenses/message.asset_does_not_exist' ));
}
$licenseSeat -> asset_id = request ( 'asset_id' );
// Override asset's assigned user if available
if ( $target -> checkedOutToUser ()) {
2021-06-10 13:15:52 -07:00
$licenseSeat -> assigned_to = $target -> assigned_to ;
2018-07-24 19:35:26 -07:00
}
2018-07-27 12:03:04 -07:00
if ( $licenseSeat -> save ()) {
2018-09-10 07:40:26 -07:00
event ( new CheckoutableCheckedOut ( $licenseSeat , $target , Auth :: user (), request ( 'note' )));
2018-07-27 15:05:45 -07:00
2018-07-24 19:35:26 -07:00
return true ;
}
2021-06-10 13:15:52 -07:00
2018-07-24 19:35:26 -07:00
return false ;
}
protected function checkoutToUser ( $licenseSeat )
{
// Fetch the target and set the license user
if ( is_null ( $target = User :: find ( request ( 'assigned_to' )))) {
return redirect () -> route ( 'licenses.index' ) -> with ( 'error' , trans ( 'admin/licenses/message.user_does_not_exist' ));
}
$licenseSeat -> assigned_to = request ( 'assigned_to' );
if ( $licenseSeat -> save ()) {
2018-09-10 07:40:26 -07:00
event ( new CheckoutableCheckedOut ( $licenseSeat , $target , Auth :: user (), request ( 'note' )));
2018-07-27 15:05:45 -07:00
2018-07-24 19:35:26 -07:00
return true ;
}
2021-06-10 13:15:52 -07:00
2018-07-24 19:35:26 -07:00
return false ;
}
}