2020-05-28 05:08:13 +00:00
< ? php
namespace App\Jobs ;
use Carbon\Carbon ;
use Illuminate\Bus\Queueable ;
use Illuminate\Contracts\Queue\ShouldQueue ;
2021-07-29 03:11:14 +00:00
use Illuminate\Database\Eloquent\Model ;
2020-05-28 05:08:13 +00:00
use Illuminate\Foundation\Bus\Dispatchable ;
use Illuminate\Queue\InteractsWithQueue ;
use Illuminate\Queue\SerializesModels ;
use Illuminate\Support\Facades\DB ;
use Illuminate\Support\Facades\Log ;
2021-07-29 03:11:14 +00:00
use Illuminate\Support\Facades\Mail ;
2020-05-28 05:08:13 +00:00
use App\Mail\TrafficMismatch ;
use App\Models\Service\Adsl ;
use App\Models\Service\AdslTraffic ;
use App\Models\AdslSupplier ;
/**
* Class BroadbandTraffic
* Read and update the traffic for an Broadband supplier
*
* @ package App\Jobs
*/
2021-07-29 03:11:14 +00:00
final class BroadbandTraffic implements ShouldQueue
2020-05-28 05:08:13 +00:00
{
use Dispatchable , InteractsWithQueue , Queueable , SerializesModels ;
2021-02-17 13:22:50 +00:00
private const LOGKEY = 'JBT' ;
2021-07-29 03:11:14 +00:00
protected Model $o ; // The supplier we are updating from
private const class_prefix = 'App\Classes\External\Supplier\\' ;
2020-05-28 05:08:13 +00:00
public function __construct ( AdslSupplier $o )
{
2021-07-29 03:11:14 +00:00
$this -> o = $o ;
2020-05-28 05:08:13 +00:00
}
/**
* Execute the job .
*
* @ return void
2021-02-17 13:22:50 +00:00
* @ throws \Exception
* @ todo The column stats_lastupdate is actually the " next " date that stats should be retrieved . Rename it .
2020-05-28 05:08:13 +00:00
*/
public function handle ()
{
2021-07-29 03:11:14 +00:00
Log :: info ( sprintf ( '%s:Importing Broadband Traffic from [%s]' , self :: LOGKEY , $this -> o -> name ));
2021-02-17 13:22:50 +00:00
2020-05-28 05:08:13 +00:00
$u = 0 ;
2021-02-17 13:22:50 +00:00
// Load our class for this supplier
2021-07-29 03:11:14 +00:00
$class = self :: class_prefix . $this -> o -> name ;
2020-05-28 05:08:13 +00:00
if ( class_exists ( $class )) {
2021-07-29 03:11:14 +00:00
$o = new $class ( $this -> o );
2020-05-28 05:08:13 +00:00
} else {
Log :: error ( sprintf ( '%s: Class doesnt exist: %d' , get_class ( $this ), $class ));
exit ( 1 );
}
2021-02-17 13:22:50 +00:00
// Repeat pull traffic data until yesterday
2021-07-29 03:11:14 +00:00
while ( $this -> o -> stats_lastupdate < Carbon :: now () -> subDay ()) {
Log :: notice ( sprintf ( '%s:Next update is [%s]' , self :: LOGKEY , $this -> o -> stats_lastupdate -> format ( 'Y-m-d' )));
2021-02-17 13:22:50 +00:00
// Delete traffic, since we'll refresh it.
2021-07-29 03:11:14 +00:00
AdslTraffic :: where ( 'supplier_id' , $this -> o -> id )
-> where ( 'date' , $this -> o -> stats_lastupdate )
2021-02-17 13:22:50 +00:00
-> delete ();
$c = 0 ;
foreach ( $o -> fetch () as $line ) {
// The first row is our header
if ( ! $c ++ ) {
$fields = $o -> getColumns ( preg_replace ( '/,\s+/' , ',' , $line ), collect ( $o -> header ()));
continue ;
}
2020-05-28 05:08:13 +00:00
2021-02-17 13:22:50 +00:00
if ( ! $fields -> count ())
abort ( 500 , '? No fields in data exportupda' );
2020-05-28 05:08:13 +00:00
2021-02-17 13:22:50 +00:00
$row = str_getcsv ( trim ( $line ));
2020-05-28 05:08:13 +00:00
2021-02-17 13:22:50 +00:00
try {
// @todo Put the date format in the DB.
$date = Carbon :: createFromFormat ( 'Y-m-d' , $row [ $o -> getColumnKey ( 'Date' )]);
2020-05-28 05:08:13 +00:00
2021-02-17 13:22:50 +00:00
// Find the right service dependant on the dates we supplied the service
$oo = Adsl :: where ( 'service_username' , $row [ $o -> getColumnKey ( 'Login' )])
-> select ( DB :: raw ( 'ab_service__adsl.*' ))
-> join ( 'ab_service' , 'ab_service.id' , '=' , 'service_id' )
-> where ( 'ab_service.date_start' , '<=' , $date -> format ( 'U' ))
-> where ( function ( $query ) use ( $date ) {
$query -> whereNULL ( 'ab_service.date_end' )
-> orWhere ( 'ab_service.date_end' , '<=' , $date -> format ( 'U' ));
})
-> get ();
2020-05-28 05:08:13 +00:00
$to = new AdslTraffic ;
$to -> site_id = 1 ; // @todo TO ADDRESS
2021-07-29 03:11:14 +00:00
$to -> date = $this -> o -> stats_lastupdate ;
$to -> supplier_id = $this -> o -> id ;
2020-05-28 05:08:13 +00:00
$to -> up_peak = $row [ $o -> getColumnKey ( 'Peak upload' )];
$to -> up_offpeak = $row [ $o -> getColumnKey ( 'Off peak upload' )];
$to -> down_peak = $row [ $o -> getColumnKey ( 'Peak download' )];
$to -> down_offpeak = $row [ $o -> getColumnKey ( 'Off peak download' )];
// $to->peer
// $to->internal
$to -> time = '24:00' ; // @todo
2021-02-17 13:22:50 +00:00
// If we have no records
if ( $oo -> count () != 1 ) {
2021-07-29 03:11:14 +00:00
Log :: error ( sprintf ( '%s:Too many services return for [%s]' , self :: LOGKEY , $row [ $o -> getColumnKey ( 'Login' )]),[ 'date' => $date , 'count' => $oo -> count ()]);
2021-02-17 13:22:50 +00:00
$to -> service = $row [ $o -> getColumnKey ( 'Login' )];
$to -> save ();
} else {
$oo -> first () -> traffic () -> save ( $to );
}
2020-05-28 05:08:13 +00:00
$u ++ ;
2021-02-17 13:22:50 +00:00
} catch ( \Exception $e ) {
2021-07-29 03:11:14 +00:00
Log :: error ( sprintf ( '%s:Exception occurred when storing traffic record for [%s].' , self :: LOGKEY , $row [ $o -> getColumnKey ( 'Login' )]),[ 'row' => $row , 'line' => $line ]);
2021-02-17 13:22:50 +00:00
throw new \Exception ( 'Error while storing traffic date' );
2020-05-28 05:08:13 +00:00
}
}
2021-07-29 03:11:14 +00:00
Log :: info ( sprintf ( '%s: Records Imported [%d] for [%s]' , self :: LOGKEY , $u , $this -> o -> stats_lastupdate -> format ( 'Y-m-d' )));
2020-05-28 05:08:13 +00:00
2021-02-17 13:22:50 +00:00
if ( $u ) {
2021-07-29 03:11:14 +00:00
$this -> o -> stats_lastupdate = $this -> o -> stats_lastupdate -> addDay ();
$this -> o -> save ();
2021-02-17 13:22:50 +00:00
2021-07-29 03:11:14 +00:00
if ( $this -> o -> trafficMismatch ( $date ) -> count ())
2021-02-17 13:22:50 +00:00
Mail :: to ( 'deon@graytech.net.au' ) // @todo To change
2021-07-29 03:11:14 +00:00
-> send ( new TrafficMismatch ( $this -> o , $date ));
2021-02-17 13:22:50 +00:00
}
}
2020-05-28 05:08:13 +00:00
}
}