osb/app/Http/Controllers/OrderController.php
2022-02-01 16:45:35 +11:00

125 lines
3.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Igaster\LaravelTheme\Facades\Theme;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Validator;
use Illuminate\Database\Eloquent\Model;
use App\Mail\OrderRequest;
use App\Models\{Account,Product,Service,User};
class OrderController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
public function index()
{
return view('order.home');
}
public function product_order(Product $o)
{
Theme::set('metronic-fe');
return view('order.widget.order',['o'=>$o]);
}
public function product_info(Product $o)
{
Theme::set('metronic-fe');
return view('order.widget.info',['o'=>$o]);
}
public function submit(Request $request)
{
Validator::make($request->all(),['product_id'=>'required|exists:ab_product,id'])
// Reseller
->sometimes('account_id','required|email',function($input) use ($request) {
return is_null($input->account_id) AND is_null($input->order_email_manual);
})
// Un-Authed User
->sometimes('order_email_manual','required|email|unique:users,email,NULL,id',function($input) use ($request) {
return (is_null($input->order_email_manual) AND ! isset($input->account_id)) OR $input->order_email_manual;
})
// Authed User
->sometimes('account_id','required|email',function($input) use ($request) {
return is_null($input->account_id) AND ! isset($input->order_email_manual);
})
->validate();
// Check the plugin details.
$po = Product::findOrFail($request->input('product_id'));
// Check we have the custom attributes for the product
$options = $po->orderValidation($request);
if ($request->input('order_email_manual')) {
$uo = User::firstOrNew(['email'=>$request->input('order_email_manual')]);
// If this is a new client
if (! $uo->exists) {
// @todo Make this automatic
$uo->site_id = config('site')->site_id;
$uo->active = FALSE;
$uo->firstname = '';
$uo->lastname = '';
$uo->country_id = config('site')->country_id; // @todo This might be wrong
$uo->parent_id = Auth::id() ?: 1; // @todo This should be configured to a default user
$uo->active = 1;
$uo->save();
}
}
// If we have a new account.
if (is_null($request->input('account_id'))) {
$ao = new Account;
//$ao->id = Account::NextId();
// @todo Make this automatic
$ao->site_id = config('site')->site_id;
$ao->country_id = config('site')->country_id; // @todo This might be wrong
$ao->language_id = config('site')->language_id; // @todo This might be wrong
$ao->currency_id = config('site')->currency_id; // @todo This might be wrong
$ao->active = 1;
$uo->accounts()->save($ao);
} else {
$ao = Account::findOrFail($request->input('account_id'));
}
$so = new Service;
// @todo Make this automatic
$so->site_id = config('site')->site_id;
$so->product_id = $request->input('product_id');
$so->order_status = 'ORDER-SUBMIT';
$so->orderby_id = Auth::id();
$so->model = get_class($options);
if ($options->order_info) {
$so->order_info = $options->order_info;
unset($options->order_info);
}
$so = $ao->services()->save($so);
if ($options instanceOf Model) {
$options->service_id = $so->id;
$options->save();
}
Mail::to('help@graytech.net.au')
->queue((new OrderRequest($so,$request->input('options.notes','')))->onQueue('email')); //@todo Get email from DB.
return view('order_received',['o'=>$so]);
}
}