diff --git a/app/Http/Controllers/SearchController.php b/app/Http/Controllers/SearchController.php new file mode 100644 index 0000000..0ecd9cb --- /dev/null +++ b/app/Http/Controllers/SearchController.php @@ -0,0 +1,40 @@ +input('term')) + return []; + + $result = collect(); + $uo = Auth::user(); + + # Look for Account + foreach (Account::Search($request->input('term')) + ->whereIN('id',$uo->all_clients()->pluck('id')) + ->orderBy('company') + ->orderBy('last_name') + ->orderBy('first_name') + ->limit(10)->get() as $o) + { + $result->push(['label'=>sprintf('A:%s %s',$o->aid,$o->name),'value'=>'/u/account/'.$o->id]); + } + + return $result; + } +} \ No newline at end of file diff --git a/app/Models/Account.php b/app/Models/Account.php index 633eeeb..4aa5e72 100644 --- a/app/Models/Account.php +++ b/app/Models/Account.php @@ -2,6 +2,7 @@ namespace App\Models; +use App\User; use Illuminate\Database\Eloquent\Model; use App\Traits\NextKey; @@ -69,19 +70,76 @@ class Account extends Model return $this->belongsTo(\App\User::class); } + /** SCOPES */ + + /** + * Search for a record + * + * @param User $uo + * @return + */ + public function scopeSearch($query,string $term) + { + // Build our where clause + // First Name, Last name + if (preg_match('/\ /',$term)) { + list($fn,$ln) = explode(' ',$term,2); + + $query->where(function($query1) use ($fn,$ln,$term) { + $query1->where(function($query2) use ($fn,$ln) { + return $query2 + ->where('first_name','like','%'.$fn.'%') + ->where('last_name','like','%'.$ln.'%'); + }) + ->orWhere('company','like','%'.$term.'%'); + }); + + } elseif (is_numeric($term)) { + $query->where('id','like','%'.$term.'%'); + + } elseif (preg_match('/\@/',$term)) { + $query->where('email','like','%'.$term.'%'); + + } else { + $query + ->where('company','like','%'.$term.'%') + ->orWhere('first_name','like','%'.$term.'%') + ->orWhere('last_name','like','%'.$term.'%'); + } + + return $query; + } + + /** ATTRIBUTES **/ + public function getActiveDisplayAttribute($value) { return sprintf('%s',$this->active ? 'success' : 'danger',$this->active ? 'Active' : 'Inactive'); } + /** + * @deprecated use getAIDAttribute() + */ public function getAccountIdAttribute() { - return sprintf('%02s-%04s',$this->site_id,$this->id); + return $this->getAIDAttribute(); } + /** + * @deprecated use getUrlAdminAttribute() + */ public function getAccountIdUrlAttribute() { - return sprintf('%s',$this->id,$this->account_id); + return $this->getUrlAdminAttribute(); + } + + /** + * Return the Account Unique Identifier + * @return string + */ + public function getAIDAttribute() + { + return sprintf('%02s-%04s',$this->site_id,$this->id); } public function getNameAttribute() @@ -104,6 +162,28 @@ class Account extends Model return $this->company ? 'Business' : 'Private'; } + /** + * Return the Admin URL to manage the account + * + * @return string + */ + public function getUrlAdminAttribute(): string + { + return sprintf('%s',$this->id,$this->account_id); + } + + /** + * Return the User URL to manage the account + * + * @return string + */ + public function getUrlUserAttribute(): string + { + return sprintf('%s',$this->id,$this->account_id); + } + + /** FUNCTIONS **/ + private function _address() { $return = []; diff --git a/app/Models/Service.php b/app/Models/Service.php index c94f269..e8a7caf 100644 --- a/app/Models/Service.php +++ b/app/Models/Service.php @@ -3,6 +3,7 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; +use Illuminate\Support\Arr; use App\Traits\NextKey; @@ -58,6 +59,17 @@ class Service extends Model 'ORDER-CANCELLED', ]; + /** + * Valid status shows the applicable next status for an action on a service + * Each status can be + * + Approved, to proceed to the next valid status' + * + Held, to a holding pattern status + * + Rejected, reverted to an different status + * + Cancel, to progress down a decomission route + * + Updated, stay on the current status with new information + * + * @var array + */ private $valid_status = [ // Order Submitted 'ORDER-SUBMIT' => ['approve'=>'ORDER-SENT','hold'=>'ORDER-HOLD','reject'=>'ORDER-REJECTED','cancel'=>'ORDER-CANCELLED'], @@ -113,11 +125,18 @@ class Service extends Model return $this->belongsTo(Product::class); } + /** + * Return a child model with details of the service + * + * @return \Illuminate\Database\Eloquent\Relations\MorphTo + */ public function type() { return $this->morphTo(null,'model','id','service_id'); } + /** SCOPES **/ + /** * Only query active categories */ @@ -141,44 +160,44 @@ class Service extends Model }); } + /** ATTRIBUTES **/ + /** * Name of the account for this service * * @return mixed */ - public function getAccountNameAttribute() + public function getAccountNameAttribute(): string { return $this->account->name; } /** - * Get the Product's Category for this service - * + * @deprecated Use getUrlAdminAttribute() */ - public function getProductCategoryAttribute(): string + public function getAdminServiceIdUrlAttribute() { - return $this->product->category; + return $this->getUrlAdminAttribute(); } /** - * Get the Product's Short Name for the service + * Date the service expires, also represents when it is paid up to * * @return string */ - public function getProductNameAttribute(): string + public function getExpiresAttribute(): string { - return $this->product->name($this->account->language); + return 'TBA'; } /** - * Return the short name for the service. - * EG: - * For ADSL, this would be the phone number, - * For Hosting, this would be the domain name, etc + * Services Unique Identifier + * + * @return string */ - public function getNameShortAttribute() + public function getSIDAttribute(): string { - return $this->model ? $this->type->name : NULL; + return sprintf('%02s-%04s.%05s',$this->site_id,$this->account_id,$this->id); } /** @@ -186,16 +205,29 @@ class Service extends Model * * @return null */ - public function getNextInvoiceAttribute() + public function getInvoiceNextAttribute() { return $this->date_next_invoice ? $this->date_next_invoice->format('Y-m-d') : NULL; } - //@todo - - public function getAdminServiceIdUrlAttribute() + /** + * Return the short name for the service. + * + * EG: + * For ADSL, this would be the phone number, + * For Hosting, this would be the domain name, etc + */ + public function getNameShortAttribute(): string { - return sprintf('%s',$this->id,$this->service_id); + return $this->model ? $this->type->name : 'NAME UNKNOWN'; + } + + /** + * @deprecated see getInvoiceNextAttribute() + */ + public function getNextInvoiceAttribute() + { + return $this->getInvoiceNextAttribute(); } /** @@ -219,35 +251,95 @@ class Service extends Model return $result; } - public function getServiceExpireAttribute() + /** + * Get the Product's Category for this service + * + */ + public function getProductCategoryAttribute(): string { - return 'TBA'; + return $this->product->category; } + /** + * Get the Product's Short Name for the service + * + * @return string + */ + public function getProductNameAttribute(): string + { + return $this->product->name($this->account->language); + } + + /** + * @deprecated see getServiceIdAttribute() + */ public function getServiceIdAttribute() { - return sprintf('%02s-%04s.%05s',$this->site_id,$this->account_id,$this->id); + return $this->getSIDAttribute(); } + /** + * @deprecated see getUrlUserAttribute() + */ public function getServiceIdUrlAttribute() + { + return $this->getUrlUserAttribute(); + } + + /** + * @deprecated see getServiceIdAttribute() + */ + public function getServiceNumberAttribute() + { + return $this->getSIDAttribute(); + } + + /** + * Return the Service Status + * + * @return string + */ + public function getStatusAttribute(): string + { + if (! $this->order_status) + return $this->active ? 'ACTIVE' : 'INACTIVE'; + else + return $this->order_status; + } + + /** + * Return the detailed order Status, with order reference numbers. + * + * @return string + */ + public function getStatusDetailAttribute(): string + { + return in_array($this->order_status,['ORDER-SENT','ORDER-HOLD','ORDERED']) + ? sprintf('%s: #%s',$this->order_status,Arr::get($this->order_info,'order_reference','Unknown')) + : ''; + } + + /** + * URL used by an admin to administer the record + * + * @return string + */ + public function getUrlAdminAttribute(): string + { + return sprintf('%s',$this->id,$this->service_id); + } + + /** + * URL used by an user to see the record + * + * @return string + */ + public function getUrlUserAttribute(): string { return sprintf('%s',$this->id,$this->service_id); } - public function getServiceNumberAttribute() - { - return sprintf('%02s.%04s.%04s',$this->site_id,$this->account_id,$this->id); - } - - public function getStatusAttribute() - { - if (! $this->order_status) - return $this->active ? 'Active' : 'Inactive'; - - return in_array($this->order_status,['ORDER-SENT','ORDER-HOLD','ORDERED']) - ? sprintf('%s: #%s',$this->order_status,array_get($this->order_info,'order_reference','Unknown')) - : $this->order_status; - } + /** SETTERS **/ public function setDateOrigAttribute($value) { @@ -259,11 +351,24 @@ class Service extends Model $this->attributes['date_last'] = $value->timestamp; } - public function isActive() + /** FUNCTIONS **/ + + /** + * Determine if a service is active. It is active, if active=1, or the order_status is not in inactive_status[] + * + * @return bool + * @todo Remove active and have order_status reflect whether active or not + */ + public function isActive(): bool { return $this->active OR ($this->order_status AND ! in_array($this->order_status,$this->inactive_status)); } + /** + * @todo + * @param string $status + * @return $this + */ public function nextStatus(string $status) { if ($x=$this->validStatus($status)) { @@ -278,6 +383,7 @@ class Service extends Model /** * This function will return the associated service model for the product type + * @deprecated use $this->type */ private function ServicePlugin() { @@ -303,8 +409,16 @@ class Service extends Model * @param string $status * @return string | NULL */ + private function testNextStatusValid(string $status) + { + return Arr::get(Arr::get($this->valid_status,$this->order_status,[]),$status,NULL); + } + + /** + * @deprecated use testNextStatusValid() + */ public function validStatus(string $status) { - return array_get(array_get($this->valid_status,$this->order_status,[]),$status,NULL); + return $this->testNextStatusValid($status); } } \ No newline at end of file diff --git a/routes/web.php b/routes/web.php index f50924c..2ad6594 100644 --- a/routes/web.php +++ b/routes/web.php @@ -58,4 +58,6 @@ Route::get('product_info/{o}', 'OrderController@product_info'); Route::redirect('/home','/u/home'); Route::demoAccess('/uc-access'); Route::redirect('/under-construction','http://www.graytech.net.au'); -Route::get('/u/{type}/{action}/{id}','UserHomeController@oldsite'); \ No newline at end of file +Route::get('/u/{type}/{action}/{id}','UserHomeController@oldsite'); + +Route::get('/search','SearchController@search'); \ No newline at end of file