o = $o; } /** * Execute the job. * * @return void * @throws \Exception */ public function handle() { Log::info(sprintf('%s:Importing Broadband Traffic from [%s]',self::LOGKEY,$this->o->name)); if ((! $connection=$this->o->detail->connections->get('broadband')) || (count(array_intersect(array_keys($connection),ExternalSupplier::traffic_connection_keys)) !== 3)) throw new \Exception('No or missing connection details for:'.self::traffic); $u = 0; // Load our class for this supplier $class = self::class_prefix.$this->o->name; if (class_exists($class)) { $o = new $class($this->o); } else { Log::error(sprintf('%s: Class doesnt exist: %s',self::LOGKEY,$class)); exit(1); } $last_update = Carbon::create(Arr::get($connection,'last'))->addDay(); Arr::set($connection,'last',$last_update->format('Y-m-d')); // Repeat pull traffic data until yesterday while ($last_update < Carbon::now()->subDay()) { Log::notice(sprintf('%s:Next update is [%s]',self::LOGKEY,$last_update->format('Y-m-d'))); // Delete traffic, since we'll refresh it. UsageBroadband::where('supplier_id',$this->o->id) ->where('date',$last_update->format('Y-m-d')) ->delete(); $c = 0; foreach ($o->fetch($connection,self::traffic) as $line) { // The first row is our header if (! $c++) { $fields = $o->getColumns(preg_replace('/,\s+/',',',$line),collect($o->header())); continue; } if (! $fields->count()) abort(500,'? No fields in data export'); $row = str_getcsv(trim($line)); try { $date = Carbon::createFromFormat('Y-m-d',$row[$o->getColumnKey('Date')]); // Find the right service dependent on the dates we supplied the service $oo = ServiceBroadband::where('service_username',$row[$o->getColumnKey('Login')]) ->select(DB::raw('service_broadband.*')) ->join('services','services.id','=','service_id') ->where('services.start_at','<=',$date) ->where(function($query) use ($date) { $query->whereNULL('services.stop_at') ->orWhere('services.stop_at','<=',$date); }) ->single(); $to = new UsageBroadband; $to->date = $last_update; $to->supplier_id = $this->o->id; $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 // If we have no records if (! $oo) { Log::error(sprintf('%s:None or too many services return for [%s]',self::LOGKEY,$row[$o->getColumnKey('Login')]),['date'=>$date]); $to->service = $row[$o->getColumnKey('Login')]; $to->site_id = 1; // @todo This needs to be worked out a better way } else { $to->site_id = $oo->site_id; $to->service_item_id = $oo->id; } if ($to->save()) $u++; } catch (\Exception $e) { Log::error(sprintf('%s:Exception occurred when storing traffic record for [%s].',self::LOGKEY,$row[$o->getColumnKey('Login')]),['row'=>$row,'line'=>$line]); throw new \Exception('Error while storing traffic data: '.$e->getMessage()); } } Log::info(sprintf('%s: Records Imported [%d] for [%s]',self::LOGKEY,$u,$last_update->format('Y-m-d'))); // Save our current progress. $this->o->detail->connections = $this->o->detail->connections->put(self::traffic,array_merge($connection,['last'=>$last_update->format('Y-m-d')])); $this->o->detail->save(); // Update our details for the next iteration. $last_update = $last_update->addDay(); Arr::set($connection,'last',$last_update->format('Y-m-d')); if ($u) { if ($this->o->trafficMismatch($date)->count()) Mail::to('deon@graytech.net.au') // @todo To change ->send(new TrafficMismatch($this->o,$date)); } } } }