diff --git a/app/Console/Commands/ServiceList.php b/app/Console/Commands/ServiceList.php
index 939e8c2..1ed9693 100644
--- a/app/Console/Commands/ServiceList.php
+++ b/app/Console/Commands/ServiceList.php
@@ -52,7 +52,7 @@ class ServiceList extends Command
if ((! $this->option('inactive')) && (! $o->is_active))
continue;
- if ($this->option('type') && ($o->product->getCategoryAttribute() !== $this->option('type')))
+ if ($this->option('type') && ($o->product->category_lc !== strtolower($this->option('type'))))
continue;
$c = $o->invoiced_items
@@ -67,7 +67,7 @@ class ServiceList extends Command
$this->info(sprintf($header,
$o->lid,
- $o->product->getCategoryNameAttribute(),
+ $o->product->category_name,
substr($o->product->getNameAttribute(),0,35),
substr($o->name_short,0,40),
$o->active ? 'active' : 'inactive',
diff --git a/app/Http/Controllers/ServiceController.php b/app/Http/Controllers/ServiceController.php
index 5b5a31c..77d9236 100644
--- a/app/Http/Controllers/ServiceController.php
+++ b/app/Http/Controllers/ServiceController.php
@@ -401,10 +401,10 @@ class ServiceController extends Controller
$request->post(),
collect($o->type->validation())
->keys()
- ->map(fn($item)=>sprintf('%s.%s',$o->product->category,$item))
+ ->map(fn($item)=>sprintf('%s.%s',$o->product->category_lc,$item))
->combine(array_values($o->type->validation()))
->map(fn($item)=>is_string($item)
- ? preg_replace('/^exclude_without:/',sprintf('exclude_without:%s.',$o->product->category),$item)
+ ? preg_replace('/^exclude_without:/',sprintf('exclude_without:%s.',$o->product->category_lc),$item)
: $item)
->merge(
[
@@ -416,7 +416,7 @@ class ServiceController extends Controller
'price' => 'nullable|numeric|min:0', // Price we charge the client, if we dont charge supplied/price
'cost' => 'nullable|numeric|min:0', // Price we are charged by supplier, if we arent charged supplier/price
'supplierid' => 'nullable|string|min:1', // As used on invoices
- $o->product->category => 'array|min:1',
+ $o->product->category_lc => 'array|min:1',
]
)
->toArray()
@@ -432,13 +432,13 @@ class ServiceController extends Controller
$validated = collect($validator->validated());
// Store our service type values
- $o->type->forceFill($validated->get($o->product->category));
+ $o->type->forceFill($validated->get($o->product->category_lc));
// Some special handling
- switch ($o->product->category) {
+ switch ($o->product->category_lc) {
case 'broadband':
// If pppoe is not set, then we dont need username/password
- $o->type->pppoe = ($x=data_get($validated,$o->product->category.'.pppoe',FALSE));
+ $o->type->pppoe = ($x=data_get($validated,$o->product->category_lc.'.pppoe',FALSE));
if (! $x) {
$o->type->service_username = NULL;
@@ -470,7 +470,7 @@ class ServiceController extends Controller
else {
// For broadband, start_at is connect_at in the type record
- switch ($o->product->category) {
+ switch ($o->product->category_lc) {
case 'broadband':
$o->start_at = $o->type->connect_at;
break;
diff --git a/app/Jobs/ImportCosts.php b/app/Jobs/ImportCosts.php
index 755c2cd..7cdde56 100644
--- a/app/Jobs/ImportCosts.php
+++ b/app/Jobs/ImportCosts.php
@@ -131,7 +131,7 @@ class ImportCosts implements ShouldQueue
if ($so) {
// r[1] = Monthly Charge or Extra Charge,r[2] = "On Plan", r[3] = Plan Info
$r = [];
- switch ($so->product->category) {
+ switch ($so->product->category_lc) {
case 'broadband':
$to = Cost\Broadband::where('site_id',$this->co->site_id)
->where('cost_id',$this->co->id)
diff --git a/app/Mail/OrderRequestApprove.php b/app/Mail/OrderRequestApprove.php
index 5b59d52..d8a2eb6 100644
--- a/app/Mail/OrderRequestApprove.php
+++ b/app/Mail/OrderRequestApprove.php
@@ -31,19 +31,17 @@ class OrderRequestApprove extends Mailable
/**
* Build the message.
- *
- * @return $this
*/
public function build()
{
Config::set('site',$this->so->site);
// @todo This is not consistent with Cancel/Change Request
- switch ($this->so->product->category) {
- case 'broadband': $subject = sprintf('%s: %s',$this->so->product->category,$this->so->type->service_address);
+ switch ($this->so->product->category_lc) {
+ case 'broadband': $subject = sprintf('%s: %s',$this->so->product->category_name,$this->so->type->service_address);
break;
- case 'phone': $subject = sprintf('%s: %s',$this->so->product->category,$this->so->type->service_number);
+ case 'phone': $subject = sprintf('%s: %s',$this->so->product->category_name,$this->so->type->service_number);
break;
default:
diff --git a/app/Models/Product.php b/app/Models/Product.php
index 438b6a6..c68ac03 100644
--- a/app/Models/Product.php
+++ b/app/Models/Product.php
@@ -77,6 +77,10 @@ class Product extends Model implements IDs
return match ($key) {
'base_cost' => round($this->supplied->base_cost,2)*Invoice::billing_change($this->type->billing_interval,$this->billing_interval) ?: 0,
+ 'category' => $this->supplied->category,
+ 'category_lc' => strtolower($this->category),
+ 'category_name' => $this->supplied->category_name,
+
default => parent::__get($key),
};
}
@@ -181,29 +185,6 @@ class Product extends Model implements IDs
return max($this->price_recur_default,$this->type->billing_interval);
}
- /**
- * This will return the category of the product (eg: domain, webhosting, etc) which is the basis for all
- * other logic of these types.
- *
- * @return string
- */
- public function getCategoryAttribute(): string
- {
- return strtolower(Str::studly($this->category_name));
- }
-
- /**
- * Return the type of service is provided. eg: Broadband, Phone.
- * This will return the category of the product (eg: domain, hosting, etc) which is the basis for all
- * other logic of these types.
- *
- * @return string
- */
- public function getCategoryNameAttribute(): string
- {
- return $this->supplied->category_name;
- }
-
/**
* How long must this product be purchased for as a service.
*
diff --git a/app/Models/Supplier.php b/app/Models/Supplier.php
index a2a3a03..22a157c 100644
--- a/app/Models/Supplier.php
+++ b/app/Models/Supplier.php
@@ -49,8 +49,8 @@ class Supplier extends Model
if ($so) {
// If we have a connections configuration for that supplier, then build the child relationships
- if (Arr::get($so->detail->connections,$class->category)) {
- $result->put($class->category,(object)[
+ if (Arr::get($so->detail->connections,$class->category_lc)) {
+ $result->put($class->category_lc,(object)[
'type' => $class->category_name,
'items' => $class->where('supplier_detail_id',$so->detail->id),
]);
@@ -63,13 +63,13 @@ class Supplier extends Model
$o->where('supplier_detail_id',$so->detail->id);
if ($o->count())
- $result->put($class->category,(object)[
+ $result->put($class->category_lc,(object)[
'type' => $class->category_name,
'items' => $class->where('supplier_detail_id',$so->detail->id),
]);
} else {
- $result->put($class->category_name,$class);
+ $result->put($class->category_lc,$class);
}
}
diff --git a/app/Models/Supplier/Type.php b/app/Models/Supplier/Type.php
index e4d7d81..2be12c1 100644
--- a/app/Models/Supplier/Type.php
+++ b/app/Models/Supplier/Type.php
@@ -10,10 +10,30 @@ use Leenooks\Traits\ScopeActive;
use App\Models\{Invoice, Supplier, SupplierDetail};
use App\Traits\SiteID;
+/**
+ * Class Supplier\Type
+ *
+ * Attributes for supplier types:
+ * + category : This will return the category of the product (eg: domain, hosting, etc), based on the class, which is the basis for all other logic of these types.
+ * + category_name : A friendly name that can override category
+ */
+
abstract class Type extends Model
{
use SiteID,ScopeActive;
+ protected const category_name = NULL;
+
+ public function __get($key): mixed
+ {
+ return match ($key) {
+ 'category' => (new \ReflectionClass($this))->getShortName(),
+ 'category_name' => static::category_name ?: $this->category,
+
+ default => parent::__get($key),
+ };
+ }
+
/* RELATIONS */
/**
@@ -33,27 +53,6 @@ abstract class Type extends Model
/* ATTRIBUTES */
- /**
- * This will return the category of the product (eg: domain, hosting, etc) which is the basis for all
- * other logic of these types.
- *
- * @return string
- */
- final public function getCategoryAttribute(): string
- {
- return strtolower((new \ReflectionClass($this))->getShortName());
- }
-
- /**
- * Return a friendly name for this product, used for display
- *
- * @return string
- */
- final public function getCategoryNameAttribute(): string
- {
- return static::category_name;
- }
-
final public function getContractTermAttribute(?int $val): int
{
return $val ?: 1;
diff --git a/resources/views/mail/admin/order/approve.blade.php b/resources/views/mail/admin/order/approve.blade.php
index bf59857..3eda162 100644
--- a/resources/views/mail/admin/order/approve.blade.php
+++ b/resources/views/mail/admin/order/approve.blade.php
@@ -8,7 +8,7 @@ Please order the following...
| Account | {{ $service->account->name }} |
| Service ID | {{ $service->sid }} |
| Product | {{ $service->product->name }} |
-@switch($service->product->category)
+@switch($service->product->category_lc)
@case('broadband')
| Address | {{ $service->type->service_address }} |
@break;
diff --git a/resources/views/mail/admin/order/reject.blade.php b/resources/views/mail/admin/order/reject.blade.php
index b990e50..dbd3ee1 100644
--- a/resources/views/mail/admin/order/reject.blade.php
+++ b/resources/views/mail/admin/order/reject.blade.php
@@ -7,7 +7,7 @@
| Account | {{ $service->account->name }} |
| Service ID | {{ $service->sid }} |
| Product | {{ $service->product->name }} |
-@switch($service->product->category)
+@switch($service->product->category_lc)
@case('broadband')
| Address | {{ is_object($service->type) ? $service->type->service_address : 'Not Supplied' }} |
@break;
diff --git a/resources/views/mail/admin/service/cancel.blade.php b/resources/views/mail/admin/service/cancel.blade.php
index a18d6e9..a47e311 100644
--- a/resources/views/mail/admin/service/cancel.blade.php
+++ b/resources/views/mail/admin/service/cancel.blade.php
@@ -9,7 +9,7 @@ Please cancel the following...
| Service ID | {{ $service->sid }} |
| Cancel Date | {{ $service->stop_at->format('Y-m-d') }} |
| Product | {{ $service->product->name }} |
-@switch($service->product->category)
+@switch($service->product->category_lc)
@case('broadband')
| Address | {{ $service->type->service_address }} |
@break;
diff --git a/resources/views/mail/admin/service/change.blade.php b/resources/views/mail/admin/service/change.blade.php
index db3aaeb..88007ad 100644
--- a/resources/views/mail/admin/service/change.blade.php
+++ b/resources/views/mail/admin/service/change.blade.php
@@ -8,7 +8,7 @@ Please change the following...
| Account | {{ $service->account->name }} |
| Service ID | {{ $service->sid }} |
| Product | {{ $service->product->name }} |
-@switch($service->product->category)
+@switch($service->product->category_lc)
@case('broadband')
| Address | {{ $service->type->service_address }} |
@break;
diff --git a/resources/views/theme/backend/adminlte/service/change_pending.blade.php b/resources/views/theme/backend/adminlte/service/change_pending.blade.php
index c700ac8..830671c 100644
--- a/resources/views/theme/backend/adminlte/service/change_pending.blade.php
+++ b/resources/views/theme/backend/adminlte/service/change_pending.blade.php
@@ -42,7 +42,7 @@