Move category/category_name product::class methods into __get(), no functional changes

This commit is contained in:
Deon George 2025-05-22 12:01:31 +10:00
parent 04ae35b1dd
commit 5ef1a27a64
23 changed files with 63 additions and 85 deletions

View File

@ -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',

View File

@ -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;

View File

@ -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)

View File

@ -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:

View File

@ -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.
*

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -42,7 +42,7 @@
<!-- PRODUCT -->
<x-leenooks::form.select id="product_id" name="broadband[product_id]" icon="fa-list" label="Product" :helper="$o->product->category_name" groupby="active"
:value="$np->id"
:options="Product::get()->filter(fn($item)=>$item->category === $np->category)->sortBy('name')->sortByDesc('active')->map(fn($item)=>['id'=>$item->id,'active'=>$item->active,'value'=>$item->name])" required/>
:options="Product::get()->filter(fn($item)=>$item->category_lc === $np->category_lc)->sortBy('name')->sortByDesc('active')->map(fn($item)=>['id'=>$item->id,'active'=>$item->active,'value'=>$item->name])" required/>
</div>
</div>

View File

@ -41,7 +41,7 @@
<div class="row">
<div class="col">
@includeIf('theme.backend.adminlte.service.widget.'.$so->product->category.'.change',['o'=>$so->type])
@includeIf('theme.backend.adminlte.service.widget.'.$so->product->category_lc.'.change',['o'=>$so->type])
</div>
</div>

View File

@ -20,7 +20,7 @@
<div class="row">
<!-- Service Details -->
<div class="col-12 col-md-5">
@includeIf('theme.backend.adminlte.service.widget.'.$o->product->category.'.details',['o'=>$o->type])
@includeIf('theme.backend.adminlte.service.widget.'.$o->product->category_lc.'.details',['o'=>$o->type])
@include('theme.backend.adminlte.service.widget.information')
</div>
@ -73,7 +73,7 @@
@if($o->product->hasUsage())
<div @class(['tab-pane','fade','show active'=>! ($x || (session()->has('service_update') || session()->has('charge_add')))]) id="traffic">
@if($o->type->usage(30)->count())
@include('theme.backend.adminlte.service.widget.'.$o->product->category.'.usagegraph',['o'=>$o->type])
@include('theme.backend.adminlte.service.widget.'.$o->product->category_lc.'.usagegraph',['o'=>$o->type])
@endif
</div>
@endif

View File

@ -38,7 +38,7 @@
</div>
</div>
@includeIf('theme.backend.adminlte.service.widget.'.$o->product->category.'.order',['o'=>$o->type])
@includeIf('theme.backend.adminlte.service.widget.'.$o->product->category_lc.'.order',['o'=>$o->type])
<div class="form-group row">
<label for="notes" class="col-sm-2 col-form-label text-right">Notes</label>

View File

@ -38,7 +38,7 @@
</div>
</div>
@includeIf('theme.backend.adminlte.service.widget.'.$o->product->category.'.order',['o'=>$o->type])
@includeIf('theme.backend.adminlte.service.widget.'.$o->product->category_lc.'.order',['o'=>$o->type])
<div class="form-group row">
<label for="notes" class="col-sm-2 col-form-label text-right">Notes</label>

View File

@ -34,11 +34,11 @@
<tr>
<th>Product</th>
<td><a href="{{ route('product',['pdo'=>$o->product_id]) }}">#{{ $o->product_id }}: {{ $o->product->name }}</a></td>
<td><a href="{{ route('supplier.product.type',['id'=>$c->supplied->id,'spo'=>$c->supplied->supplier_detail_id,'type'=>$c->supplied->category]) }}">#{{ $c->supplied->id }}: {{ $c->supplied->name_long }}</a></td>
<td><a href="{{ route('supplier.product.type',['id'=>$c->supplied->id,'spo'=>$c->supplied->supplier_detail_id,'type'=>$c->category_lc]) }}">#{{ $c->supplied->id }}: {{ $c->supplied->name_long }}</a></td>
<td>{{ $c->category_name }}</td>
@if($p->exists)
<th><a href="{{ route('product',['pdo'=>$p->id]) }}">#{{ $p->id }}: {{ $p->name }}</a></th>
<td class="text-center"><a href="{{ route('supplier.product.type',['id'=>$p->supplied->id,'spo'=>$p->supplied->supplier_detail_id,'type'=>$p->supplied->category]) }}">#{{ $p->supplied->id }}: {{ $p->supplied->name_long }}</a></td>
<td class="text-center"><a href="{{ route('supplier.product.type',['id'=>$p->supplied->id,'spo'=>$p->supplied->supplier_detail_id,'type'=>$p->category_lc]) }}">#{{ $p->supplied->id }}: {{ $p->supplied->name_long }}</a></td>
<td>&nbsp;</td>
@endif
</tr>

View File

@ -51,7 +51,7 @@
:value="$o->product_id"
:options="Product::with(['type.supplied','translate'])
->get()
->filter(fn($item)=>($item->category === $o->product->category))
->filter(fn($item)=>($item->category_lc === $o->product->category_lc))
->sortBy('name')
->map(fn($item)=>[
'id'=>$item->id,
@ -65,7 +65,7 @@
</div>
<hr>
@includeIf('theme.backend.adminlte.service.widget.'.$o->product->category.'.update',['o'=>$o->type])
@includeIf('theme.backend.adminlte.service.widget.'.$o->product->category_lc.'.update',['o'=>$o->type])
<div class="row">
<div class="col">

View File

@ -53,7 +53,7 @@ if(isset($spo)) {
<div class="col-4">
<!-- Offering Type -->
<x-leenooks::form.select name="offering_type" icon="fa-cogs" label="Type" helper="Offering Type" :choose="true" :value="$oo?->category ?? ''" :options="Supplier::offeringTypes()->sortBy(fn($item)=>$item->category_name)->map(fn($item)=>['id'=>$item->category,'value'=>$item->category_name])"/>
<x-leenooks::form.select name="offering_type" icon="fa-cogs" label="Type" helper="Offering Type" :choose="true" :value="$oo?->category_lc ?? ''" :options="Supplier::offeringTypes()->sortBy(fn($item)=>$item->category_name)->map(fn($item)=>['id'=>$item->category_lc,'value'=>$item->category_name])"/>
</div>
</div>
@ -180,7 +180,7 @@ if(isset($spo)) {
$(document).ready(function() {
@if(isset($oo) && $oo->exists)
$('#offering_type').attr('style','pointer-events: none;');
load_type('{{$oo->category}}',{{$oo->id}})
load_type('{{$oo->category_lc}}',{{$oo->id}})
@endif
$('#offering_type').on('change',function() {

View File

@ -37,7 +37,7 @@
<tbody>
@foreach($xx=$offering->items->with(['products.products.services'])->get() as $oo)
<tr>
<td><a href="{{ route('supplier.product.type',['id'=>$oo->id,'spo'=>$oo->supplier_detail_id,'type'=>$oo->category]) }}">{{ $oo->id }}</a></td>
<td><a href="{{ route('supplier.product.type',['id'=>$oo->id,'spo'=>$oo->supplier_detail_id,'type'=>$oo->category_lc]) }}">{{ $oo->id }}</a></td>
<td>{{ $oo->name }}</td>
<td>{{ $oo->name_long }}</td>
<td class="text-right">{{ $oo->active ? 'YES' : 'NO' }}</td>

View File

@ -40,7 +40,7 @@
@foreach($oo->products->pluck('products')->flatten()->filter() as $po)
<tr>
<td><a href="{{ route('product',['pdo'=>$po->id]) }}">{{ $po->lid }}</a></td>
<td>{{ $po->pid }} <small>[<a href="{{ route('supplier.product.type',['id'=>$po->supplied->id,'spo'=>$po->supplier->id,'type'=>$po->supplied->category]) }}">{{ $po->supplied->name }}</a>]</small></td>
<td>{{ $po->pid }} <small>[<a href="{{ route('supplier.product.type',['id'=>$po->supplied->id,'spo'=>$po->supplier->id,'type'=>$po->supplied->category_lc]) }}">{{ $po->supplied->name }}</a>]</small></td>
<td>{{ $po->name }}</td>
<td class="text-right">{{ $po->active ? 'YES' : 'NO' }}</td>
<td class="text-right">{{ $po->billing_interval_string }}</td>

View File

@ -1,9 +1,9 @@
<!-- $pdo=Product::class [{{$pdo->category}}]-->
@if(View::exists('theme.frontend.metronic.order.widget.info.'.$pdo->category))
@if(View::exists('theme.frontend.metronic.order.widget.info.'.$pdo->category_lc))
<div class="box box-primary">
<div class="box-body">
{{-- Return Category Requirements --}}
@include('theme.frontend.metronic.order.widget.info.'.$pdo->category)
@include('theme.frontend.metronic.order.widget.info.'.$pdo->category_lc)
{{-- Return Supplier Requirements --}}
{{-- Return Product Requirements --}}

View File

@ -1,5 +1,5 @@
<!-- $pdo=Product::class [{{$pdo->category}}] -->
@if(View::exists('theme.frontend.metronic.order.widget.order.'.$pdo->category))
@if(View::exists('theme.frontend.metronic.order.widget.order.'.$pdo->category_lc))
<div class="box box-primary">
<div class="box-header with-border">
<h3 class="box-title">Order Configuration</h3>
@ -7,7 +7,7 @@
<div class="box-body">
{{-- Return Category Requirements --}}
@include('theme.frontend.metronic.order.widget.order.'.$pdo->category)
@include('theme.frontend.metronic.order.widget.order.'.$pdo->category_lc)
{{-- Return Supplier Requirements --}}
{{-- Return Product Requirements --}}