osb/app/Models/Service/Broadband.php
Deon George 2512182910
All checks were successful
Create Docker Image / Build Docker Image (x86_64) (push) Successful in 31s
Create Docker Image / Final Docker Image Manifest (push) Successful in 9s
Update service update to use components, enhanced form handling and submission. Added pppoe to broadband and changed validation to allow for longer service number.
2024-07-24 14:14:11 +10:00

184 lines
4.2 KiB
PHP

<?php
namespace App\Models\Service;
use Carbon\Carbon;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Log;
use App\Interfaces\ServiceUsage;
use App\Models\Supplier\Broadband as SupplierBroadband;
use App\Models\Supplier\Type as SupplierType;
use App\Models\Usage\Broadband as UsageBroadband;
use App\Rules\IPv6_CIDR;
/**
* Class Broadband (Service)
* Services that are Internet Broadband
*/
class Broadband extends Type implements ServiceUsage
{
private const LOGKEY = 'MSB';
protected $table = 'service_broadband';
/* INTERFACES */
/**
* Return the service address
*
* @return string
*/
public function getServiceDescriptionAttribute(): string
{
return strtoupper($this->service_address) ?: '-';
}
/**
* Return the service number
*
* @return string
*/
public function getServiceNameAttribute(): string
{
return $this->service_number ?: ($this->service_address ?: '-');
}
/**
* The usage information for broadband
*
* @return \Illuminate\Database\Eloquent\Relations\HasMany
*/
public function traffic()
{
return $this->hasMany(UsageBroadband::class,'service_item_id')
->where('site_id',$this->site_id);
}
/* ATTRIBUTES */
/**
* @deprecated use $o->service_name;
* @return mixed|string
*/
public function getNameAttribute()
{
abort(500,'deprecated - use $o->service_name');
return $this->service_number ?: $this->service_address;
}
/**
* The type of technology used to provide this Internet Service
*
* @param $value
* @return null|string
*/
public function getTechnologyAttribute($value): ?string
{
return $value ?: $this->supplied()->technology;
}
/* OVERRIDES */
/**
* Service update validation
*
* @return array
*/
public function validation(): array
{
return [
'service_number' => 'nullable|string|min:10|max:11',
'service_address' => 'nullable|string|min:5',
'service_username' => 'exclude_without:pppoe|nullable|string|min:3',
'service_password' => 'exclude_without:pppoe|nullable|string|min:8',
'pppoe' => 'nullable|in:on',
'connect_at' => 'nullable|date',
'start_at' => 'nullable|date',
'expire_at' => 'nullable|date|after:start_at',
'ipaddress' => 'nullable|ipv4',
'ip6address' => ['nullable',new IPv6_CIDR],
];
}
/* METHODS */
/**
* Return the suppliers offering that this service is providing
*
* @return SupplierType
* @todo This column provided_adsl_plan_id should either be deprecated or renamed.
*/
public function supplied(): SupplierType
{
return $this->provided_adsl_plan_id
? SupplierBroadband::findOrFail($this->provided_adsl_plan_id)
: $this->service->offering->supplied;
}
/**
* Return service usage data
*
* @param int $days
* @return Collection
*/
public function usage(int $days=31): Collection
{
$maxdate = $this->usage_last_date();
if (! $maxdate)
return collect();
return $this->traffic()
->where('date','<=',$maxdate->date->format('Y-m-d'))
->where('date','>=',$maxdate->date->subDays($days)->format('Y-m-d'))
->get();
}
/**
* Find the last date any traffic was recorded for a service
*
* @return UsageBroadband|null
*/
private function usage_last_date(): ?UsageBroadband
{
return $this->traffic
->sortBy('date')
->last();
}
public function usage_summary(int $months=2): Collection
{
$maxdate = $this->usage_last_date();
if (! $maxdate)
return collect();
Log::debug(sprintf('%s:Getting Usage data for [%d] months from [%s]',self::LOGKEY,$months,$maxdate),['m'=>__METHOD__]);
// Go back an extra month;
$start = $maxdate->date->subMonths($months);
// If we are before the 15th
if ($start->day < 15) {
$start = Carbon::createFromFormat('Y-m-d',$start->subMonth()->format('Y-m-').'15');
} else {
$start = $start->subDays($start->day-15);
}
Log::debug(sprintf('%s:Getting Usage data from [%s]',self::LOGKEY,$start->format('Y-m-d')),['m'=>__METHOD__]);
$result = collect();
foreach ($this->traffic()
->where('date','>=',$start->format('Y-m-d'))
->where('date','<=',$maxdate->date->format('Y-m-d'))
->get()->groupBy(function($item) {
return sprintf('%s->%s',$item->trafficMonthStart->format('d M'),$item->trafficMonthEnd->format('d M'));
}) as $key => $o) {
$result->put($key,$o->sum('total'));
}
return $result;
}
}